C# 如何在EF4中为多个ObjectContext实现单个SQL事务

C# 如何在EF4中为多个ObjectContext实现单个SQL事务,c#,entity-framework,C#,Entity Framework,我有一个相当大的数据库,其中包含为不同业务模块创建的表 我们决定分别为不同的模块创建不同的edmx文件 但是,在尝试为将导致写入不同edmx中的多个表的逻辑操作实现TransactionScope时,如何防止使用MSDTC?同样,底层数据库是相同的,我不想在这种情况下使用MSDTC 是否有任何方法可以通过活动事务传入打开的SQL连接 提前谢谢你的帮助 问候,, 当数据库不同和/或连接字符串不同时,William将登记MSDTC Rick Strahl对此有自己的看法(他的观点是LINQ到SQL,

我有一个相当大的数据库,其中包含为不同业务模块创建的表

我们决定分别为不同的模块创建不同的edmx文件

但是,在尝试为将导致写入不同edmx中的多个表的逻辑操作实现TransactionScope时,如何防止使用MSDTC?同样,底层数据库是相同的,我不想在这种情况下使用MSDTC

是否有任何方法可以通过活动事务传入打开的SQL连接

提前谢谢你的帮助

问候,,
当数据库不同和/或连接字符串不同时,William将登记MSDTC

Rick Strahl对此有自己的看法(他的观点是LINQ到SQL,但它适用于EF)。货币条款:

TransactionScope是一个高级事务包装器,它使 很容易将任何代码包装到事务中,而无需跟踪 手动处理事务。传统上,TransactionScope是.NET 包装分布式事务协调器(DTC),但它是 功能有所扩展。一个问题是故障诊断码(DTC)不正确 在资源使用方面相当昂贵,它要求 DTC服务实际上正在机器上运行(另一项服务 这在客户端安装上尤其麻烦)

但是,TransactionScope和SQL Server客户端的最新更新 驱动程序使使用TransactionScope类和 只要您在运行,就使用它提供的无需DTC 针对单个数据库和单个一致连接 一串在上面的示例中,由于事务与 DataContext的单个实例,事务实际上可以工作 不涉及DTC。这是在SQLServer2008中

我在这里找到了Rick博客的链接


因此,如果您连接到同一个数据库并使用相同的连接字符串,则不应涉及DTC。

感谢以上所有回复

顺便说一下,我们找到了一个解决方案,就是显式地使用EntityConnection和EntityTransaction。示例如下所示:

    string theSqlConnStr = "data source=TheSource;initial catalog=TheCatalog;persist security info=True;user id=TheUserId;password=ThePassword";

    EntityConnectionStringBuilder theEntyConnectionBuilder = new EntityConnectionStringBuilder();
    theEntyConnectionBuilder.Provider = "System.Data.SqlClient";
    theEntyConnectionBuilder.ProviderConnectionString = theConnectionString;
    theEntyConnectionBuilder.Metadata = @"res://*/";

    using (EntityConnection theConnection = new EntityConnection(theEntyConnectionBuilder.ToString()))
    {
        theConnection.Open();
        theET = null;

        try
        {
            theET = theConnection.BeginTransaction();

            DataEntities1 DE1 = new DataEntities1(theConnection);
            //DE1 do somethings...

            DataEntities2 DE2 = new DataEntities2(theConnection);
            //DE2 do somethings...

            DataEntities3 DE3 = new DataEntities3(theConnection);
            //DE3 do somethings...

            theET.Commit();
        }
        catch (Exception ex)
        {
            if (theET != null) { theET.Rollback(); }
        }
        finally
        {
            theConnection.Close();
        }
    }
通过显式使用EntityConnection和EntityTransaction,我可以为单个数据库的多个ObjectContext实现单个连接和事务的共享,而无需使用MSDTC


希望这些信息是有用的。祝你好运

您不一定需要在EF中执行所有操作。