viernes, 22 de julio de 2016

Entity Framework Core 1.0. Shadow Properties

Ayer estuve en una charla de Unai Zorrilla sobre las novedades que implementa la nueva versión de EF, denominada EF Core.

Hay muchas (y muy buenas y otras por llegar), pero una que me hizo esbozar una pequeña sonrisilla fue la inclusión de las Shadow Properties.

Qué es una Shadow Propery

Una shadow property es una propiedad que no pertenece a nuestra Entidad. Lo primero que se vino a la cabeza son los campos de auditoría que tenemos en las tablas de nuestra base de datos (quién crea, cuándo se crea, quién modifica, cuándo se modifica).
No parece tener mucho sentido andar con estos atributos arriba y abajo en nuestra aplicación cuando realmente no se usan. De esta forma sólo los usaremos cuándo se produzca una actualización de la entidad.

El valor de estas propiedades es mantenido por el Change Tracker API.

Cómo definir una Shadow property

Imaginemos que tenemos este modelo


  1. public class Orders  
  2. {  
  3.     public int ID  
  4.     {  
  5.         get;  
  6.         set;  
  7.     }  
  8.     public string OrderNumber{  
  9.         get;  
  10.         set;  
  11.     }  
  12. }  
  13.   
  14. // Definition of DbContext class  
  15. public class MyContext: DbContext   
  16. {  
  17.     public DbSet < Orders > Orders {  
  18.         get;  
  19.         set;  
  20.     }  
  21.   
  22.     protected override void OnModelCreating(ModelBuildermodelBuilder)  
  23.     {  
  24.   
  25.     }  
  26. }  

Lo que tenemos que hacer, sobreescribir el evento OnModelCreating de nuestro dbContext y definir la shadow  property

  1. protected override void OnModelCreating(ModelBuildermodelBuilder)  
  2. {  
  3.     modelBuilder.Entity < Orders > ()  
  4.         .Property < DateTime > ("CreatedDate");  

  5. base.OnModelCreating(builder);
  6. }



Lo que tenemos que hacer, sobreescribir el evento OnModelCreating de nuestro dbContext y definir la shadow  property

  1. //Por simplicidad no hago comprobaciones ni miro el estado de la entidad
  2. public override int SaveChanges()
  3. {
  4. MyContext.Entry(Orders  ).Property("CreatedDate").CurrentValue = DateTime.Now; 

  5. return base.SaveChanges();
  6. }



Aquí os dejo un link con la documentación de Microsoft: EF Core 1.0 Shadow Properties