IRepositoy.InsertOrUpdateAsync 抛出并发异常
IRepositoy.InsertOrUpdateAsync throwing concurrency exception
我正在使用 entityframework 和 .net 核心在 ABP 上创建一个内容管理系统。使用 InsertOrUpdateAsync 时出现并发异常。我的 table.
中没有任何数据
请找到用于创建 table 的模型。
[Table("CMSContents")]
public class CMSContent:Entity<int>
{
public const int MAXTITLELENGHT = 128;
public const int MAXCONTENTLENGTH = 10000;
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public override int Id { get; set; }
/// <summary>
/// The title of the content.
/// </summary>
[Required]
[StringLength(MAXTITLELENGHT)]
public virtual string PageName { get; set; }
/// <summary>
/// The Cms Content
/// </summary>
public virtual string PageContent { get; set; }
protected CMSContent()
{
}
public static CMSContent CreateContent(int id,string title ,string contents)
{
var @content = new CMSContent
{
Id = id,
PageName = title,
PageContent = contents
};
return @content;
}
}
}
下面是用于调用存储库的应用程序服务。
public async Task<CMSContent> InsertOrUpdateCMSContent(CreateContentInput input)
{
var @content = CMSContent.CreateContent(input.Id,input.PageName, input.PageContent);
return await _contentManager.InsertOrUpdateAsync(@content);
}
从 Swagger 调用此 API 时出现异常,
Mvc.ExceptionHandling.AbpExceptionFilter - 数据库操作预期影响 1 行但实际上影响了 0 行。自加载实体以来,数据可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=527962。
Abp.Domain.Uow.AbpDbConcurrencyException: 数据库操作预期影响 1 行但实际上影响了 0 行。自加载实体以来,数据可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=527962。 ---> Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: 数据库操作预期影响 1 行但实际上影响了 0 行。自加载实体以来,数据可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=527962。
在 Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException(Int32 commandIndex,Int32 expectedRowsAffected,Int32 rowsAffected)
在 Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ConsumeResultSetWithoutPropagationAsync(Int32 commandIndex,RelationalDataReader reader,CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ConsumeAsync(RelationalDataReader reader,CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection 连接,CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(DbContext _, ValueTuple2 parameters, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func
4 操作, Func4 verifySucceeded, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IReadOnlyList
1 entriesToSave, CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(布尔值 acceptAllChangesOnSuccess,CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(布尔值 acceptAllChangesOnSuccess,CancellationToken cancellationToken)
在 D:\Github\aspnetboilerplate\src\Abp.EntityFrameworkCore\EntityFrameworkCore\AbpDbContext.cs:line 224 中的 Abp.EntityFrameworkCore.AbpDbContext.SaveChangesAsync(CancellationToken cancellationToken)
--- 内部异常堆栈跟踪结束 ---
在 D:\Github\aspnetboilerplate\src\Abp.EntityFrameworkCore\EntityFrameworkCore\AbpDbContext.cs:line 230 中的 Abp.EntityFrameworkCore.AbpDbContext.SaveChangesAsync(CancellationToken cancellationToken)
在 Abp.Zero.EntityFrameworkCore.AbpZeroCommonDbContext`3.SaveChangesAsync(CancellationToken cancellationToken) 在 D:\Github\aspnetboilerplate\src\Abp.ZeroCore.EntityFrameworkCore\Zero\EntityFrameworkCore\AbpZeroCommonDbContext.cs:line 170
在 D:\Github\aspnetboilerplate\src\Abp.EntityFrameworkCore\EntityFrameworkCore\Uow\EfCoreUnitOfWork.cs:第 167 行中的 Abp.EntityFrameworkCore.Uow.EfCoreUnitOfWork.SaveChangesInDbContextAsync(DbContext dbContext)
在 Abp.EntityFrameworkCore.Uow.EfCoreUnitOfWork.SaveChangesAsync() 中 D:\Github\aspnetboilerplate\src\Abp.EntityFrameworkCore\EntityFrameworkCore\Uow\EfCoreUnitOfWork.cs: 第 68 行
在 Abp.EntityFrameworkCore.Uow.EfCoreUnitOfWork.CompleteUowAsync() 中 D:\Github\aspnetboilerplate\src\Abp.EntityFrameworkCore\EntityFrameworkCore\Uow\EfCoreUnitOfWork.cs: 第 83 行
在 D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkBase.cs 中的 Abp.Domain.Uow.UnitOfWorkBase.CompleteAsync():第 273 行
在 Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter.OnActionExecutionAsync(ActionExecutingContext 上下文,下一个 ActionExecutionDelegate)在 D:\Github\aspnetboilerplate\src\Abp.AspNetCore\AspNetCore\Mvc\Uow\AbpUowActionFilter.cs:line 51
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext 上下文)
我已经尝试了以下方法使其工作,作为答案发布,因为评论不允许这么多字符。
public async Task<CMSContent> InsertOrUpdateCMSContent(CreateContentInput input)
{
var exists = await _contentRepository
.GetAll()
.AnyAsync(e => e.Id == input.Id);
if (!exists)
{
var @content = CMSContent.CreateContent(input.PageName, input.PageContent);
return await _contentRepository.InsertAsync(@content);
}
else
{
var @content = CMSContent.CreateContent(input.Id, input.PageName, input.PageContent);
return await _contentRepository.UpdateAsync(@content);
}
}
我正在使用 entityframework 和 .net 核心在 ABP 上创建一个内容管理系统。使用 InsertOrUpdateAsync 时出现并发异常。我的 table.
中没有任何数据请找到用于创建 table 的模型。
[Table("CMSContents")]
public class CMSContent:Entity<int>
{
public const int MAXTITLELENGHT = 128;
public const int MAXCONTENTLENGTH = 10000;
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public override int Id { get; set; }
/// <summary>
/// The title of the content.
/// </summary>
[Required]
[StringLength(MAXTITLELENGHT)]
public virtual string PageName { get; set; }
/// <summary>
/// The Cms Content
/// </summary>
public virtual string PageContent { get; set; }
protected CMSContent()
{
}
public static CMSContent CreateContent(int id,string title ,string contents)
{
var @content = new CMSContent
{
Id = id,
PageName = title,
PageContent = contents
};
return @content;
}
}
}
下面是用于调用存储库的应用程序服务。
public async Task<CMSContent> InsertOrUpdateCMSContent(CreateContentInput input)
{
var @content = CMSContent.CreateContent(input.Id,input.PageName, input.PageContent);
return await _contentManager.InsertOrUpdateAsync(@content);
}
从 Swagger 调用此 API 时出现异常,
Mvc.ExceptionHandling.AbpExceptionFilter - 数据库操作预期影响 1 行但实际上影响了 0 行。自加载实体以来,数据可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=527962。
Abp.Domain.Uow.AbpDbConcurrencyException: 数据库操作预期影响 1 行但实际上影响了 0 行。自加载实体以来,数据可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=527962。 ---> Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: 数据库操作预期影响 1 行但实际上影响了 0 行。自加载实体以来,数据可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=527962。
在 Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException(Int32 commandIndex,Int32 expectedRowsAffected,Int32 rowsAffected)
在 Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ConsumeResultSetWithoutPropagationAsync(Int32 commandIndex,RelationalDataReader reader,CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ConsumeAsync(RelationalDataReader reader,CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection 连接,CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(DbContext _, ValueTuple2 parameters, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func
4 操作, Func4 verifySucceeded, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IReadOnlyList
1 entriesToSave, CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(布尔值 acceptAllChangesOnSuccess,CancellationToken cancellationToken)
在 Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(布尔值 acceptAllChangesOnSuccess,CancellationToken cancellationToken)
在 D:\Github\aspnetboilerplate\src\Abp.EntityFrameworkCore\EntityFrameworkCore\AbpDbContext.cs:line 224 中的 Abp.EntityFrameworkCore.AbpDbContext.SaveChangesAsync(CancellationToken cancellationToken)
--- 内部异常堆栈跟踪结束 ---
在 D:\Github\aspnetboilerplate\src\Abp.EntityFrameworkCore\EntityFrameworkCore\AbpDbContext.cs:line 230 中的 Abp.EntityFrameworkCore.AbpDbContext.SaveChangesAsync(CancellationToken cancellationToken)
在 Abp.Zero.EntityFrameworkCore.AbpZeroCommonDbContext`3.SaveChangesAsync(CancellationToken cancellationToken) 在 D:\Github\aspnetboilerplate\src\Abp.ZeroCore.EntityFrameworkCore\Zero\EntityFrameworkCore\AbpZeroCommonDbContext.cs:line 170
在 D:\Github\aspnetboilerplate\src\Abp.EntityFrameworkCore\EntityFrameworkCore\Uow\EfCoreUnitOfWork.cs:第 167 行中的 Abp.EntityFrameworkCore.Uow.EfCoreUnitOfWork.SaveChangesInDbContextAsync(DbContext dbContext)
在 Abp.EntityFrameworkCore.Uow.EfCoreUnitOfWork.SaveChangesAsync() 中 D:\Github\aspnetboilerplate\src\Abp.EntityFrameworkCore\EntityFrameworkCore\Uow\EfCoreUnitOfWork.cs: 第 68 行
在 Abp.EntityFrameworkCore.Uow.EfCoreUnitOfWork.CompleteUowAsync() 中 D:\Github\aspnetboilerplate\src\Abp.EntityFrameworkCore\EntityFrameworkCore\Uow\EfCoreUnitOfWork.cs: 第 83 行
在 D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkBase.cs 中的 Abp.Domain.Uow.UnitOfWorkBase.CompleteAsync():第 273 行
在 Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter.OnActionExecutionAsync(ActionExecutingContext 上下文,下一个 ActionExecutionDelegate)在 D:\Github\aspnetboilerplate\src\Abp.AspNetCore\AspNetCore\Mvc\Uow\AbpUowActionFilter.cs:line 51
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext 上下文)
我已经尝试了以下方法使其工作,作为答案发布,因为评论不允许这么多字符。
public async Task<CMSContent> InsertOrUpdateCMSContent(CreateContentInput input) { var exists = await _contentRepository .GetAll() .AnyAsync(e => e.Id == input.Id); if (!exists) { var @content = CMSContent.CreateContent(input.PageName, input.PageContent); return await _contentRepository.InsertAsync(@content); } else { var @content = CMSContent.CreateContent(input.Id, input.PageName, input.PageContent); return await _contentRepository.UpdateAsync(@content); } }