Я пытаюсь настроить оптимистичный параллелизм в своем приложении, используя свойство 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);
}