我希望设置实体框架,使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)设置为null。这迫使EF无法看到事务,并执行相反的操作,即创建一个新事务。
有没有人在EF 5中关闭事务并取得成功,或者我的唯一解决方案是黑客和构建自己版本的sql连接器?
谢谢!