2011-07-02 13 views

Respuesta

26

Puede configurar una columna en sus tablas denominada RowVersion y decirle a Entity Framework que desea que esta columna se incluya en las cláusulas where de todas las instrucciones UPDATE y DELETE. Luego, asegúrese de incrementar este campo para todas las entidades modificadas. Lo he hecho así:

//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(); 
    } 
} 
+0

He leído esta pregunta. tiene una idea diferente gracias http://stackoverflow.com/questions/3412690/entity-framework-objectcontext-concurrency –

+1

¿No puedo hacerlo sin una columna de versión de fila? –

+1

Supongo que podría establecer más de una propiedad con 'IsConcurrencyToken()' y EF agregará estas columnas en la cláusula where de sus instrucciones de actualización y eliminación. No he probado esto sin embargo. –

Cuestiones relacionadas