Лучший способ справиться с параллелизмом с помощью Entity Framework - PullRequest
13 голосов
/ 02 июля 2011

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

Ответы [ 2 ]

26 голосов
/ 02 июля 2011

Вы можете настроить столбец в ваших таблицах с именем 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();
    }
}
6 голосов
/ 02 июля 2011

Вы видели этот урок: http://www.asp.net/entity-framework/tutorials/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application

Вы можете сделать это без столбца версии строки, но это часто требует сохранения большого количества состояний, что может отрицательно повлиять на производительность.

...