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