時々(複数のタブで同じWebページを開くとき)、ASP.NET CoreでEntity Frameworkを使用して変更を保存するときに、次の例外が発生します。現在、私はIIS Expressで(Visual Studio 2017のデバッグを通じて)ローカルに実行しています。ASP.NET MVCコアでEntity Frameworkを使用したSqlTransaction例外の取得
Microsoft.EntityFrameworkCore.DbContext:Error: An exception occurred in the database while saving changes.
System.InvalidOperationException: This SqlTransaction has completed; it is no longer usable.
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
at System.Data.SqlClient.SqlTransaction.Commit()
...
Microsoft.EntityFrameworkCore.DbContext:Error: An exception occurred in the database while saving changes.
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Data.SqlClient.SqlInternalTransaction.Commit()
at System.Data.SqlClient.SqlTransaction.Commit()
...
System.Data.SqlClient.SqlException: The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
...
次のコードでSaveChangesAsync()
メソッドが呼び出されたときにこれらの例外がスローされる:
public async void Remove(int statementId)
{
Statement statement = _data.Statements.FirstOrDefault(s => s.StatementId == statementId);
if (statement != null)
{
_data.Statements.Remove(statement);
await _data.SaveChangesAsync();
}
}
_data
はASPコアマニュアルに従ってコントローラに依存性を注入することができるApplicationDbContext
であり、(中このケースはカスタム中間リポジトリクラスにあります)、毎回using
でラップせずに再利用しました。しかし、エラーはこれを意味するように思われる...
私は問題を正確に指摘しました。私のリポジトリクラスは 'IServiceCollection'によって' AddTransient() 'として登録されましたが、これは間違った生涯です。それは[AddScoped() '](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection)でなければなりません。それにもかかわらず、例外のいくつか(?)が残っています。 –
非同期の 'SaveChanges()'(および 'AddScoped')を使用すると、これらの問題はなくなりましたが、非同期shoundがこれに影響する理由は何ですか? –
これはasyncの使用に関連するかもしれないことを知ったので、私は以下を見つけました:[Dependency Injected UserManagerは非同期呼び出し(ASP.NET CORE)で処理しています](http://stackoverflow.com/q/41325518/590790) –