日期:2014-05-20  浏览次数:21009 次

督察兔在吗?请教一个问题~
督察童鞋好,谢谢你上次关于动态生成linq查询的回答。
喜欢linq to sql的理由是因为其简单暴力,
用linq做了几个小项目,一般都是简单的update和insert操作使用linq,
但关键操作还是存储过程(处理),和select模型库(查询),linq并没有深入研究。
突然想到关于linq还有一个问题忘了提问,活动已关闭,只好这里问了。

问题如下:
1.当DataContext.SubmitChanges()的时候,是否附加一些SQL语句(比如常规的update,insert等DML),
能和提交的linq数据表对象,拥有共同的事务。

2.设计器上归于不同的DataContext的表,能否有办法转换成同一个DataContext进行操作和SubmitChanges().

------解决方案--------------------
糖糖睡懒觉了呢,我打个酱油。

Linq To SQL不知道行不行,因为我没有试过,不过EF支持你从DataContext继承一个自己的类,重写SaveChanges方法,添加自己的业务逻辑在里面。还有就是建议你使用触发器。

另一个问题似乎无解,我google了下,微软论坛的微软员工同学给出的方案竟然是AsEnumerable/ToList,晕。
------解决方案--------------------
LINQ2SQL支持隐式事务,当你调用 SubmitChanges 时,LINQ to SQL 会检查此调用是否在 Transaction 的作用域内或者 Transaction 属性 (IDbTransaction) 是否设置为由用户启动的本地事务。 如果这两个事务均未找到,则 LINQ to SQL 启动本地事务 (IDbTransaction),并使用此事务执行所生成的 SQL 命令。 当所有 SQL 命令均已成功执行完毕时,LINQ to SQL 提交本地事务并返回。

http://stackoverflow.com/questions/542525/transactionscope-vs-transaction-in-linq-to-sql
------解决方案--------------------
BPM的表单模板几乎都是用户使用时自定义的,也就是说字段设计随时需要被用户方面的系统管理人员改变,甚至字段本身还是另外一个二维表或者另外一个表单,它不适合使用关系数据库,应该使用NOSQL数据库。而且也无需考虑事务(以业务设计来完成类似的功能)。
------解决方案--------------------
1.可以,都使用同一个datacontext执行,然后提交就行
2.using (TransactionScope scope = new TransactionScope())
{
    db1操作
     其他操作(比如发邮件)
     db2操作
     scope.Complete();  (仅当3个操作全部成功才会提交)
}
但是必须开启msdtc分布式事务服务。