私は、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 ツールを使用すると、トランザクションがコミットされていることがわかります。
Entity Framework のオープン ソース コードを調べたところ、ObjectContext.ExecuteInTransaction で、一般的なキャッチに ReleaseConnection() の呼び出しが表示されました。その方法では、誰もそれを使用していないと判断された場合、接続は閉じられます。しかし、finally ブロックでは、トランザクションが破棄されます (別名ロールバック)。
だから私はここで少し迷っています。誰でもこれで私を助けることができますか?
ありがとう、スティーブン。
更新 EF6 の RTM と最新バージョンの Devart プロバイダー 8.0.17 を使用して小さなテスト プロジェクトをビルドしますが、上記と同じ結果になります。
また、テスト プロジェクトを SqlServer Express に指定したところ、完全に動作しました。そのため、Devart プロバイダーを検討する必要があると思います。