Я использую сущность framework 4.1. Каков наилучший способ обработки concurrency с каркасом сущности. Есть ли встроенная функциональность для ее обработки в рамках сущности? Можно ли обойтись без добавления дополнительного столбца в таблицы, чтобы сохранить версию строки?
Лучший способ обработки concurrency с помощью сущности
Ответ 1
Вы видели этот учебник: http://www.asp.net/entity-framework/tutorials/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application
Вы можете сделать это без столбца rowversion, но это часто требует хранения большого количества состояний, что может отрицательно повлиять на производительность.
Ответ 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();
}
}