2010-01-19 5 views
10

Todas nuestras tablas de base de datos tienen UpdateUserID y UpdateTS. Me gustaría tener este conjunto si mi entidad tiene cambios. ¿Hay alguna manera de que pueda tener esta actualización en el lugar condicionalmente?Marco de entidad: configuración de la marca de tiempo de actualización

Si configuro manualmente UpdateTS en el código, dirá que mi entidad ha cambiado y siempre actualizará el objeto.

Respuesta

3

Usted debe ser capaz de manejar el evento SavingChanges (example here) y realizar la lógica como se indica por @sander

7

me llaman a este método de extensión antes de llamar context.SaveChanges():

public static void SetLastModified(this ObjectContext context, DateTime dateTime) 
{ 
    DateTime now = DateTime.UtcNow; 
    foreach (ObjectStateEntry entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)) 
    { 
     if (!entry.IsRelationship) 
     { 
      IHasLastModified lastModified = entry.Entity as IHasLastModified; 
      if (lastModified != null) 
       lastModified.LastModified = now; 
     } 
    } 
} 

puedo llamar fácilmente este código, porque he envoltorio ObjectContext en una clase repositorio. Si lo está utilizando desnudo, puede conectar el evento ObjectContext.SavingChanges para hacer algo similar.

+0

Tratando de hacer lo mismo que se enumeran aquí, pero luchando con IHasLastModified. solo obteniendo una entrada nula en lastModified. ¿Sería capaz de publicar el código que tiene para esta interfaz, o informar cómo hacer que sus entidades hereden de él? – Martin

+1

Me aseguro de que mi objeto de datos tenga una propiedad 'DateTime' llamada LastModified, y luego implemente la interfaz en una clase parcial (para que la generación del código no lo descarte). Debido a que la propiedad ya está allí, no hay código para implementar –

6

Aquí está una implementación de las otras dos ideas, con las siguientes consideraciones

  • Asegúrese de que usted ya sea crear proxies que detecten cambios automáticamente, o que haya detectado cambios manualmente, antes de la llamada a SaveChanges(). De lo contrario, el estado del objeto será EntityState.Unmodified y la última marca de tiempo modificada no se actualizará.
  • que han ampliado el código para establecer también la última fecha y hora modificada cuando el objeto se crea por primera vez (EntityState.Added)

El Código

public interface IHasLastModified 
{ 
    DateTime? LastModified { get; set; } 
} 

public class MyClass : IHasLastModified 
{ 
    public virtual int Id { get; set; } 

    public virtual string SomeOtherProperty { get; set; } 

    public virtual DateTime? LastModified { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public override int SaveChanges() 
    {    
     DateTime now = DateTime.UtcNow; 
     foreach (ObjectStateEntry entry in (this as IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)) 
     { 
      if (!entry.IsRelationship) 
      { 
       IHasLastModified lastModified = entry.Entity as IHasLastModified; 
       if (lastModified != null) 
        lastModified.LastModified = now; 
      } 
     } 

     return base.SaveChanges(); 
    } 
+0

Utilizo una solución similar. Sin embargo, también debo ser capaz de manejar entidades sin proxy (que el código anterior omite). Propuse una modificación de la respuesta para apoyar esto, sin embargo, fue rechazado ... – Anders

+1

@Anders: simplemente publique su propia respuesta con la modificación a continuación. Puede hacer referencia a mi respuesta y señalar cómo la suya maneja adecuadamente las entidades sin proxy. –

Cuestiones relacionadas