2017-05-03 12 views
0

時々(複数のタブで同じ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でラップせずに再利用しました。しかし、エラーはこれを意味するように思われる...

+0

私は問題を正確に指摘しました。私のリポジトリクラスは 'IServiceCollection'によって' AddTransient() 'として登録されましたが、これは間違った生涯です。それは[AddScoped() '](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection)でなければなりません。それにもかかわらず、例外のいくつか(?)が残っています。 –

+0

非同期の 'SaveChanges()'(および 'AddScoped')を使用すると、これらの問題はなくなりましたが、非同期shoundがこれに影響する理由は何ですか? –

+0

これはasyncの使用に関連するかもしれないことを知ったので、私は以下を見つけました:[Dependency Injected UserManagerは非同期呼び出し(ASP.NET CORE)で処理しています](http://stackoverflow.com/q/41325518/590790) –

答えて

0

エンティティフレームワークの接続が切断されているようで、これは寿命がApplicationDbContextの問題です。

リポジトリクラス(内部ApplicationDbContextに頼る1)is registered in IServiceCollection as AddScoped() and not AddTransient()のことを確認してください。

Entity FrameworkのコンテキストはScoped寿命を使用して、サービス・コンテナ に追加する必要があります。

また、use async Task instead of async void for asynchronous methods which do not return anythingます。voidを返す

非同期メソッドは、彼らが完了した 呼び出すコードを通知する簡単な方法を提供していません。

voidのように、呼び出されるオブジェクトは、待機するものがないので、即座に処理される(接続を閉じる)ようです。

関連する問題