ADOentity framework是否支持非DTC交易? 一个EntityContext和一个TransactionScope内的多个查询导致DTC升级

我有一个使用entity framework的Web应用程序 – 我们使用TransactionScope类来提供环境事务。

有没有办法告诉EF使用标准T-SQL事务优先于DTC事务? 我们经常在一个EntityContext和一个TransactionScope实例中对不同的表进行大量查询,但这似乎总是将事务提升到DTC

我举了一个简短的例子,见下文。 对单个表的查询正确地启动了一个T-SQL事务并且在连接SPID 54上然后查询到ContactUs表并且EF在另一个连接(SPID 53)上执行此操作,该连接具有促进事务的连接效果到DTC交易。**

using (MyEntities DB = new MyEntities()) { using (TransactionScope t = new TransactionScope()) { DB.Individual.First().EmailAddress = "bob" + DateTime.Now.Second.ToString() + "@bob.com"; // done on connection 54 DB.ContactUs.First(); // done on connection 53 thus promoting the transaction!! DB.SaveChanges(); t.Complete(); } } 

  1. 在连接字符串上设置Enlist = false以避免在事务上自动登记。

  2. 手动登记连接作为事务范围的参与者。 (http://msdn.microsoft.com/en-us/library/ms172153%28v=VS.80%29.aspx)

您没有提及,但听起来您使用的是SQL Server 2005.在SQL Server 2005下,如果在TransactionScope中打开了多个连接,则事务将从轻量级事务升级到分布式事务 。 它是否是相同的数据库和相同的ConnectionString并不重要 – 它仍然被提升。

这不是Entity Framework的“问题”,因为它是System.Transactions的现有行为。 普通的ADO.NET也存在这个问题。 在过去,我使用了Enterprise Library,其中包含参与事务的连接列表,如果您在事务中尝试检索新连接,它将返回已经打开并参与您的连接的连接。交易。

如果使用SQL Server 2008,则行为会得到改进,以便在打开到同一数据库的多个连接时不会提升事务 。

导致使用分布式交易的不是entity framework; 相反,它是TransactionScope 。 EF将使用“正常”事务来包装在单次调用SaveChanges()的上下文中执行的所有SQL语句。 在您给出的示例中,您只能调用SaveChanges 。 因此,您根本不需要使用TransactionScope来自动应用您的更改。

我不知道如何使TransactionScope使用非分布式事务,但我有理由相信它不是entity framework。

我正在使用带有ASP.NET成员资格系统的Entity Framework来解决DTC升级问题,因为两者使用不同的连接字符串。 在会员系统的连接字符串中设置“Enlist = false”为我解决了问题。