2010-01-19 25 views
10

Tutte le nostre tabelle di database hanno UpdateUserID e UpdateTS. Mi piacerebbe avere questo set se la mia entità ha dei cambiamenti. C'è un modo per avere questo aggiornamento sul posto condizionatamente?Entity Framework: impostazione dell'ora di aggiornamento

Se imposto manualmente UpdateTS nel codice, allora dirà che la mia entità è cambiata e aggiornerà sempre l'oggetto.

risposta

3

Si dovrebbe essere in grado di gestire l'evento SavingChanges (example here) ed eseguire la logica, come indicato dal @sander

7

Io chiamo questo metodo di estensione prima di chiamare 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; 
     } 
    } 
} 

posso facilmente chiamare questo codice, perché ho involucro ObjectContext in una classe repository. Se lo stai utilizzando, puoi collegare l'evento ObjectContext.SavingChanges per fare qualcosa di simile.

+0

Cercando di fare lo stesso come elencato qui, ma che lotta con IHasLastModified. sempre e solo ottenendo una voce nulla in lastModified. Saresti in grado di pubblicare il codice che hai per questa interfaccia, o di informare come fai a ereditarne le entità? – Martin

+1

Mi assicuro che il mio oggetto dati abbia una proprietà 'DateTime' chiamata LastModified e quindi implementa l'interfaccia in una classe parziale (quindi la generazione del codice non la getta via). Poiché la proprietà è già presente, non esiste un codice per implementare –

6

Ecco un'implementazione delle altre due idee, con le seguenti considerazioni

  • Assicurarsi che si creare proxy che rilevano automaticamente le modifiche o che sono state rilevate manualmente modifiche prima della chiamata a SaveChanges(). In caso contrario, lo stato dell'oggetto sarà EntityState.Unmodified e l'ultimo timestamp modificato non verrà aggiornato.
  • ho ampliato il codice per impostare anche l'ultimo timestamp modificato quando l'oggetto viene creato (EntityState.Added)

Il Codice

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

Io uso una soluzione simile, tuttavia devo essere in grado di gestire anche le entità senza proxy (che mancano nel codice precedente). Ho proposto una modifica della risposta per supportare questo, tuttavia è stato respinto ... – Anders

+1

@ Anders: basta inserire la propria risposta con la modifica quindi. Puoi fare riferimento alla mia risposta e indicare come il tuo gestisce correttamente le entità senza proxy. –

Problemi correlati