我正在开发一个项目,该项目使用 Entity Framework 6 RC 通过 Devart 提供程序(v7.8.322.0)连接到 Mysql 数据库。
但是现在我遇到一个问题,当查询失败时,事务的回滚失败,因为连接被关闭了。
我们自己并没有开始任何交易。
这是异常的堆栈跟踪:
System.InvalidOperationException: Connection must be opened.
at Devart.Common.Utils.CheckConnectionOpen(IDbConnection connection)
at Devart.Data.MySql.MySqlConnection.Rollback()
at Devart.Data.MySql.MySqlTransaction.Dispose(Boolean disposing)
at System.Data.Common.DbTransaction.Dispose()
at System.Data.Entity.Core.EntityClient.EntityTransaction.Dispose(Boolean disposing)
at System.Data.Common.DbTransaction.Dispose()
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy)
at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass28.<SaveChanges>b__25()
at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at System.Data.Entity.DbContext.SaveChanges()
at Nallian.Dal.MySql.NallianDbContext.Nallian.Data.Common.Contracts.IUnitOfWork.SaveChanges() in c:\TFS2012\Nallian\Main\Nallian.Dal.MySql\NallianDbContext.cs:line 117
...
更奇怪的是,当我使用 devart dbmonitor 工具时,我看到事务被提交。
我查看了实体框架开源代码,在 ObjectContext.ExecuteInTransaction 中我看到了对 ReleaseConnection() 的调用。在该方法中,如果确定没有人再使用它,则连接将关闭。但是在 finally 块中,事务被处理(又名回滚)。
所以我在这里有点迷失了。有人可以帮我吗?
谢谢,史蒂文。
更新 我使用 EF6 的 RTM 和最新版本的 Devart 提供程序 8.0.17 构建了一个小型测试项目,但结果与上述相同。
我还将我的测试项目指向了 SqlServer Express,它在那里完美运行。所以我想我必须开始关注 Devart 提供商。