EF6将每个存储过程调用包装在自己的事务中.怎么预防这个?

g.p*_*dou 30 sql-server entity-framework transactions

使用SQL Server Profiler进行概述:EF 6使用BEGIN TRAN和包装每个存储过程调用COMMIT TRAN.

这不是一个突破性的变化吗?

也许它不仅是一个突破性的变化,而且在SP中使得任何事务逻辑都不可能,因为我们永远不能使用存储过程回滚我们的事务ROLLBACK TRAN(注意:SQL Server中没有嵌套事务),因此一个回滚回滚到@@TRANCOUNT零.因为我们在事务中因为EF 6我们得到"EXECUTE后的事务计数表示BEGIN和COMMIT语句的数量不匹配.前一个计数= 1,当前计数= 0".标准SQL Server错误.

请不要问我为什么要调用存储过程.我有数百个,所有这些都在使用TRY ... COMMIT ... CATCH ROLLBACK逻辑.

任何想法如何防止EF 6这样做?

Mas*_*ini 34

该方法存在重载ExecuteSqlCommand,可防止此行为:

db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, sql, parameters);
Run Code Online (Sandbox Code Playgroud)


cro*_*sek 26

在EF 6.1.2中,标志控制行为.将EnsureTransactionsForFunctionsAndCommands设置为false将影响已导入实体的SP(这些内部调用ExecuteFunction()).

 using (SomeEf6Context ctx = NewContext())
 {
     ctx.Configuration.EnsureTransactionsForFunctionsAndCommands = false;
     // Call an imported SP
 }      
Run Code Online (Sandbox Code Playgroud)

该设置不会影响任何SaveChanges()调用.

MSDN链接

  • 需要强调的是,此修复程序需要更新到 EF 6.1.2 或更高版本。我一直在想为什么我将近一个星期都找不到 ensureTransactionsForFunctionsAndCommands 属性,因为我一直在使用 EF 6.0.0。 (2认同)