Как обрабатывать параллелизм в ASP.NET Framework 4.6.1 с использованием aspboilerplate и Entity Framework Core - PullRequest
0 голосов
/ 09 января 2019

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

Я не могу получить

DbUpdateConcurrencyException

появится во время тестирования.

Тест, который я выполнил, - это выполнить команду SQL обновления для объекта, в то время как на внешнем интерфейсе тот же объект загружен в память.

У кого-нибудь есть идеи, где я ошибаюсь?

Тестовый скрипт SQL:

UPDATE [dbo].[MyEntity]
SET [Name] = 'fdgopiifdgdf'
WHERE [Id] = '64E7C7AE-DF4E-4F24-B321-384772CD1186'

Организация:

[Table("MyEntity")]
public class MyEntity : FullAuditedEntity<Guid>, IConcurrencyCheck
{
    [Required]
    public virtual string Name { get; set; }

    public virtual int Order { get; set; }
    public virtual bool Active { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }
}

Dto:

public class CreateOrEditMyEntityDto : EntityDto<Guid?>
{
    [Required]
    public string Name { get; set; }

    public int Order { get; set; }
    public bool Active { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }
}

CustomDtoMapper для сущности:

configuration.CreateMap<MyEntity, MyEntityDto>();

DbContext OnModelСоздание метода:

modelBuilder.Entity<MyEntity>()
    .Property(a => a.RowVersion)
    .IsRowVersion()
    .IsConcurrencyToken()
    .ValueGeneratedOnAddOrUpdate();

Изменить метод сущности:

public async Task Update(CreateOrEditMyEntityDto input)
{
    //Handle multi processing concurrency issues.
    try
    {
        var MyEntity = await _MyEntityRepository.FirstOrDefaultAsync((Guid)input.Id);
        ObjectMapper.Map(input, MyEntity);
    }
    catch (DbUpdateConcurrencyException)
    {
        throw new UserFriendlyException("Please reload to edit this record.");
    }
}

У меня это работает, вот что я сделал, используя временную метку RowVersion в файле DbContext.

protected override void ApplyAbpConceptsForModifiedEntity(EntityEntry entry, long? userId, EntityChangeReport changeReport)
{
    if (entry.OriginalValues.GetType().GetProperty("RowVersion") != null)
    {
        entry.OriginalValues["RowVersion"] = entry.CurrentValues["RowVersion"];
    }

    base.ApplyAbpConceptsForModifiedEntity(entry, userId, changeReport);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...