Подтвердить что ты не робот

Лучший способ обработки concurrency с помощью сущности

Я использую сущность framework 4.1. Каков наилучший способ обработки concurrency с каркасом сущности. Есть ли встроенная функциональность для ее обработки в рамках сущности? Можно ли обойтись без добавления дополнительного столбца в таблицы, чтобы сохранить версию строки?

4b9b3361

Ответ 2

Вы можете настроить столбец в таблицах с именем RowVersion и сообщить Entity Framework, что вы хотите, чтобы этот столбец был включен в предложения where всех операторов UPDATE и DELETE. Затем вы гарантируете, что вы увеличиваете это поле для всех измененных объектов. Я сделал это вот так:

//make all entities that need concurrency implement this and have RowVersion field in database
public interface IConcurrencyEnabled
{
    int RowVersion { get; set; }
}
public class MyDbContext : DbContext
{
    public override int SaveChanges()
    {
        foreach(var dbEntityEntry in ChangeTracker.Entries().Where(x => x.State == EntityState.Added || x.State == EntityState.Modified))
        {
            IConcurrencyEnabled entity = dbEntityEntry.Entity as IConcurrencyEnabled;
            if (entity != null)
            {
                entity.RowVersion = entity.RowVersion + 1;
            }
        }
        return base.SaveChanges();
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        //do all your custom model definition but have the following also:
        modelBuilder.Entity<myEntity>().Property(x => x.RowVersion).IsConcurrencyToken();
    }
}