【发布时间】:2019-09-17 02:24:09
【问题描述】:
有时(尤其是在多个选项卡中打开同一个网页时)我在 ASP.NET Core 上使用 Entity Framework 保存更改时收到以下异常之一。目前,我在 IIS Express 上本地运行(通过 Visual Studio 2017 调试)。
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 是ApplicationDbContext,根据 ASP Core 文档,它可以在控制器中注入依赖项(在这种情况下是在自定义中间存储库类中)并在不包装 using 的情况下重复使用,如过去的。然而,这些错误似乎暗示这不能正常工作......
【问题讨论】:
-
我以为我找到了问题所在:我的存储库类通过
IServiceCollection注册为AddTransient(),而这是不正确的生命周期。它should beAddScoped()。无论如何,......(一些?)例外仍然存在。 -
目前,使用非异步
SaveChanges()(和AddScoped)时,这些问题似乎已经消失,但我不知道为什么异步会影响这个? -
现在我知道这可能与使用异步有关,我发现以下内容:Dependency Injected UserManager is disposing on async call (ASP.NET CORE)
标签: entity-framework asp.net-core-mvc