2011-08-12 7 views
10

Me gustaría agregar algo de lógica a los eventos de inserción y actualización de algunos objetos EF. Tengo una aplicación MVC con un objeto de categoría que tiene una propiedad que es una versión comprimida de la propiedad del nombre.En la lógica de inserción/actualización en el código EF primero

public class Category 
{ 

    public string Name { get; set; } 
    public string UrlName{ get; set; } 
} 

me gustaría establecer la propiedad urlname sólo en los eventos de inserción y actualización porque mi lógica slugify es bastante elaborado.

Soy consciente de que puedo agregar algo de lógica dentro de la función SaveChanges() en el contexto en sí, pero prefiero poner el código más cerca de la entidad misma.

¿Hay alguna manera de lograr tal cosa usando primero el código EF?

Respuesta

21

Puede configurar una clase base con los métodos a ser llamado antes de inserción y actualización

public abstract class Entity 
{ 
    public virtual void OnBeforeInsert(){} 
    public virtual void OnBeforeUpdate(){} 
} 

public class Category : Entity 
{ 

    public string Name { get; set; } 
    public string UrlName{ get; set; } 

    public override void OnBeforeInsert() 
    { 
     //ur logic 
    } 
} 

Luego, en su DbContext

public override int SaveChanges() 
    { 
     var changedEntities = ChangeTracker.Entries(); 

     foreach (var changedEntity in changedEntities) 
     { 
      if (changedEntity.Entity is Entity) 
      { 
       var entity = (Entity)changedEntity.Entity; 

       switch (changedEntity.State) 
       { 
        case EntityState.Added: 
         entity.OnBeforeInsert(); 
         break; 

        case EntityState.Modified: 
         entity.OnBeforeUpdate(); 
         break; 

       } 
      } 
     } 

     return base.SaveChanges(); 
    } 
+1

Esta es una mala solución ya que obliga a la herencia. Mejor forma sería usar Interface. – Migol

+1

La respuesta de @Migol ilustra cómo puede implementar un mecanismo de devolución de llamada. Cómo lo implementa depende de usted. – Eranga

+1

@Migol, su respuesta es buena porque el uso de interfaces fuerza la implementación de los métodos. – orourkedd

1

No, no existe tal punto de extensión porque su entidad es POCO, no es consciente de su persistencia. Dicha lógica debe activarse en la capa de acceso a datos que tenga en cuenta la persistencia. La API DbContext solo ofrece una anulación de SaveChanges.

Puede exponer eventos personalizados o métodos en sus entidades y llamarlos durante el procesamiento en SaveChanges.

Cuestiones relacionadas