IRepositoy.InsertOrUpdateAsync выбрасывает исключение параллелизма - PullRequest
0 голосов
/ 14 апреля 2019

Я создавал систему управления контентом на ABP, используя entityframework и .net core.Я получаю исключение параллелизма при использовании InsertOrUpdateAsync.У меня нет данных в моей таблице.

Пожалуйста, найдите модель, использованную для создания таблицы.

   [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);
        }

Исключительная ситуация при вызове этого API из Swagger,

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, Int32 expectedRowsAffected rowsAffected) в Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ConsumeResultSetWithoutPropagationAsync (Int32 commandIndex, RelationalDataReader читателя, CancellationToken CancellationToken) в Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ConsumeAsync(Читатель RelationalDataReader, CancellationToken cancellationToken) в Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync (соединение IRelationalConnection, CancellationToken cancellationToken) в Microsoft.EntityFramework * *.* 1 recordsToSave, CancellationToken cancellationToken) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync (Boolean acceptAllChangesOnSuступа, CancellationToken CancellationToken) при Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync (булево acceptAllChangesOnSuccess, CancellationToken CancellationToken) при Abp.EntityFrameworkCore.AbpDbContext.SaveChangesAsync (CancellationToken CancellationToken) в D: \ Github \ aspnetboilerplate \ SRC \ Abp.EntityFrameworkCore \ EntityFrameworkCore \ AbpDbContext.cs: строка 224 --- Конец трассировки стека внутренней исключительной ситуации --- в Abp.EntityFrameworkCore.AbpDbContext.SaveChangesAsync (CancellationToken cancellationToken) в D: \ Github \ aspnetboilerplate \ src \ Abp.EntityFrameworkCore \ 230. EntityForec.deat Abp.Zero.EntityFrameworkCore.AbpZeroCommonDbContext`3.SaveChangesAsync (CancellationToken cancellationToken) в D: \ Github \ aspnetboilerplate \ src \ Abp.ZeroCore.EntityFrameworkCoreForeCoreEOFC.SaveChangesInDbContextAsync (DbContext dbContext) в D: \ Github \ aspnetboilerplate \ src \ Abp.EntityFrameworkCore \ EntityFrameworkCore \ Uow \ EfCoreUnitOfWork.cs: строка 167 в Abp.EntityFrameworkCore.Uow.EfCoreUnitOfWork.SaveChangesAsync () в D: \ Github \ aspnetboilerplate \ src \ Entry EworkEF.EntityFrameworkCore.Uow.EfCoreUnitOfWork.CompleteUowAsync () в D: \ Github \ aspnetboilerplate \ src \ Abp.EntityFrameworkCore \ EntityFrameworkCore \ Uow \ EfCoreUnitOfWork.Un.Github \ aspnetboilerplate \ src \ Abp \ Domain \ Uow \ UnitOfWorkBase.cs: строка 273в Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter.OnActionExecutionAsync (контекст ActionExecutingContext, далее ActionExecutionDelegate) в D: \ Github \ aspnetboilerplate \ src \ Abp.AspNetCore \ AspNetCore \ Ab.Net.ore.Sec.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync () в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow (контекст ActionExecutedContext)

1 Ответ

0 голосов
/ 15 апреля 2019

Я попробовал следующий подход, чтобы заставить его работать, публикуя как ответ, так как комментарий не позволил бы так много символов.

      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);
        }            
    }
...