督察童鞋好,谢谢你上次关于动态生成linq查询的回答。
喜欢linq to sql的理由是因为其简单暴力,
用linq做了几个小项目,一般都是简单的update和insert操作使用linq,
但关键操作还是存储过程(处理),和select模型库(查询),linq并没有深入研究。
突然想到关于linq还有一个问题忘了提问,活动已关闭,只好这里问了。问题如下:
1.当DataContext.SubmitChanges()的时候,是否附加一些SQL语句(比如常规的update,insert等DML),
能和提交的linq数据表对象,拥有共同的事务。2.设计器上归于不同的DataContext的表,能否有办法转换成同一个DataContext进行操作和SubmitChanges().

解决方案 »

  1.   

    糖糖睡懒觉了呢,我打个酱油。Linq To SQL不知道行不行,因为我没有试过,不过EF支持你从DataContext继承一个自己的类,重写SaveChanges方法,添加自己的业务逻辑在里面。还有就是建议你使用触发器。另一个问题似乎无解,我google了下,微软论坛的微软员工同学给出的方案竟然是AsEnumerable/ToList,晕。
      

  2.   


    触发器是一个不错的选择,但是我们在C#程序,对表与表之间的联动关系,做了规则引擎,
    对引擎进行增补可能动态产生SQL,我们一般把规则都写在与数据库无关的地方,
    数据库只是简单的存储,和必要的批操作。
    所以如果DataContext能够灌入SQL,共享事务,对我们来说是最好的选择了。
      

  3.   

    才发现.net有专属的linq版块,貌似我是发错地方了。
    麻烦版主帮忙转移一下。
      

  4.   


    1. 你可以在SubmitChanges后,在TransactionScope.Complete之前,做这些DML操作啊,比如:
      using (TransactionScope scope = new TransactionScope())
    {
       //make some changes to the data
       db.SubmitChanges();
       
       //make the other changes to the data
       db.SubmitChanges();
       scope.Complete();
    }2.这个目前LINQ还不支持,不过有其他变通的方法,比如在db1中通过View,store prcedure来操作db2,然后在db1中映射这些到Datacontxt里边,在代码里就可以通过一个datacontxt来操作两个数据库了
      

  5.   


    1. 你可以在SubmitChanges后,在TransactionScope.Complete之前,做这些DML操作啊,比如:
      using (TransactionScope scope = new TransactionScope())
    {
       //make some changes to the data
       db.SubmitChanges();
       
       //make the other changes to the data
       db.SubmitChanges();
       scope.Complete();
    }2.这个目前LINQ还不支持,不过有其他变通的方法,比如在db1中通过View,store prcedure来操作db2,然后在db1中映射这些到Datacontxt里边,在代码里就可以通过一个datacontxt来操作两个数据库了TransactionScope需要开启几个服务,而有些小项目,我们是在客户端执行Linq to Sql,
    所以客户端不一定会开启那样的服务。
    有没有办法通过调用DataContext的事务,然后进行操作。
      

  6.   

    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
      

  7.   

    实际操作了一下,对于一些像BPM这样的系统,用linq插入表单,
    但是相关流程操作要用sql去实现,和linq要共享一个transaction,比较困难···
    如果在客户端本地启动transaction,不构建WCF之类引擎,winform程序执行TransactionScope还是会出错,
    提示要开启分布式服务。
      

  8.   

    实际操作了一下,对于一些像BPM这样的系统,用linq插入表单,
    但是相关流程操作要用sql去实现,和linq要共享一个transaction,比较困难···
    如果在客户端本地启动transaction,不构建WCF之类引擎,winform程序执行TransactionScope还是会出错,
    提示要开启分布式服务。
    我现在尝试使用DataContext的Transaction属性(DbTransaction)
      

  9.   

    BPM的表单模板几乎都是用户使用时自定义的,也就是说字段设计随时需要被用户方面的系统管理人员改变,甚至字段本身还是另外一个二维表或者另外一个表单,它不适合使用关系数据库,应该使用NOSQL数据库。而且也无需考虑事务(以业务设计来完成类似的功能)。
      

  10.   

    (也许我们对BPM这个概念的认识不同)当我看到“实际操作了一下,对于一些像BPM这样的系统,用linq插入表单”这样的描述,我感觉看到了一个纠结、争论、辛苦20倍的可悲开发团队。唉。
      

  11.   

    1.可以,都使用同一个datacontext执行,然后提交就行
    2.using (TransactionScope scope = new TransactionScope())
    {
        db1操作
         其他操作(比如发邮件)
         db2操作
         scope.Complete();  (仅当3个操作全部成功才会提交)
    }
    但是必须开启msdtc分布式事务服务。
      

  12.   


    BPM定义数据是使用xml类型数据存储文件,并不是关系数据库,当然也可以使用nosql,另外感觉即使合适关系数据库也无大不妥。
    但BPM的生产数据还是在放关系型数据库的。
    生产数据是需要考虑事务的。
      

  13.   

    后期艰辛程序跟前期框架设计有关,我们不是纯粹的CRUD团队。当然也不能完全免除CRUD类型开发,但总体上,我们是有一个自己的不错的开发框架的,代码比较严谨,风格也还行,应用面也算广泛,并且打算在来年准备好技术开放论坛后开源。
    再说到你觉得略鄙视的“纠结、争论、辛苦20倍”,团队有过这样的日子,但回想起来也乐在其中,子非鱼~
      

  14.   

    经过测试,初步通过这样的方式达到了效果。            Willand.Kema.ORM.PTS.PTSDataContext dc = new Willand.Kema.ORM.PTS.PTSDataContext();            
    dc.Connection.Open();
                DbTransaction tran = dc.Connection.BeginTransaction();
                dc.Transaction = tran;