我想设置实体框架,以便 SavesChanges() 不会用 BEGIN 和 COMMIT 包装所有生成的 SQL。我从一个相关的SO 问题中发现了这个建议:
using( var transation = new TransactionScope(TransactionScopeOption.Suppress) )
{
ObjectContext.SaveChanges();
}
但这对我不起作用。我们正在使用 MYSQL 连接器,所以我确实通过逐步浏览源代码进行了一些挖掘,我发现 EntityFramework 是要求创建新事务的那个,而不是连接器的错误,请参见以下内容堆栈跟踪。
接下来我开始翻阅EF的源码(EF 6是开源的,相关代码在反编译器中看起来是一样的)
var needLocalTransaction = false;
var connection = (EntityConnection)Connection;
if (connection.CurrentTransaction == null
&& !connection.EnlistedInUserTransaction
&& _lastTransaction == null)
{
needLocalTransaction = startLocalTransaction;
}
...
if (needLocalTransaction)
{
localTransaction = connection.BeginTransaction();
}
好的,所以如果交易不存在,它会自己创建一个。并进一步了解如何在 EF 中设置当前事务我得到了 EF 设置连接的代码
var currentTransaction = Transaction.Current;
EnsureContextIsEnlistedInCurrentTransaction(
currentTransaction,
() =>
{
Connection.Open();
_openedConnection = true;
_connectionRequestCount++;
return true;
},
false);
这似乎是“TransactionScopeOption.Suppress”行发挥作用的唯一地方,但是所做的只是将环境事务(Transaction.Current)设置为空。强制 EF 看不到交易并做与我想要的相反的事情并创建新交易。
是否有其他人在 EF 5 中关闭事务有任何运气,或者是我破解和构建我自己版本的 sql 连接器的唯一解决方案?
谢谢!