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, Func4 操作, Func4 verifySucceeded, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IReadOnlyList1 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);
        }            
    }