5

ho dell'entità seguenti:Entity Framework Codice Prima DateTime aggiornamento campo sulla modificazione

public class User 
{ 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
    public string UserAddress { get; set; } 
    public DateTime CreateDate { get; set; } 
    public DateTime? UpdateDate { get; set; } 
} 

Come posso rendere il campo dell'entità UserUpdateDate diventare il server DateTime su un aggiornamento? Vale a dire, ogni volta che un'entità nel database viene modificata, il campo UpdateDate cambia in quella data e ora esatta, nonché come dire UpdateDate = new DateTime(Datetime.Now.Ticks)

+0

@Patrick: Salve, desidero assegnare la data del server al campo UpdateDate quando si utilizza context.SaveChanges(), dopo aver aggiornato il record. – cristianqr

+0

Vedere: http://stackoverflow.com/questions/3879011/entity-framework-sql2008-how-to-automatically-update-lastmodified-fields-for-e – alvonellos

+1

Il * solo * modo per farlo correttamente è da un database grilletto. Non c'è modo di dire quanta latenza ci sarà tra il recupero della data/ora del database e il commit effettivo di un'entità. –

risposta

0

È possibile farlo solo con le migrazioni. Impostare il parametro defaultSqlValue per la proprietà UpdateDate su "GETDATE()" o "GETUTCDATE()" e quando si modifica o si aggiunge una nuova entità è necessario impostarne il valore su null.

8

Innanzitutto, considerare che DateTimeOffset è una scelta migliore se si intende memorizzare le ore locali. In alternativa, è possibile utilizzare uno DateTime basato su UTC, ma in questo esempio mostrerò DateTimeOffset. Non archiviare mai uno DateTime locale per questo scopo, poiché si avranno problemi con i fusi orari e l'ora legale. Vedi anche: The Case Against DateTime.Now.

Successivamente, considerare un'interfaccia comune che è possibile utilizzare per le entità su cui si desidera tenere traccia dei valori creati/aggiornati.

public interface IDatedEntity 
{ 
    DateTimeOffset Created { get; set; } 
    DateTimeOffset Updated { get; set; } 
} 

Applicare quell'interfaccia e le sue proprietà alle entità con cui si sta lavorando.

public class User : IDatedEntity 
{ 
    // ... 

    public DateTimeOffset Created { get; set; } 
    public DateTimeOffset Updated { get; set; } 
} 

Ora nel tuo contesto di database, è possibile allegare alla manifestazione SavingChanges e applicare il comportamento desiderato:

public class MyContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 

    public MyContext() 
    { 
     var objectContext = ((IObjectContextAdapter)this).ObjectContext; 
     objectContext.SavingChanges += (sender, args) => 
     { 
      var now = DateTimeOffset.Now; 
      foreach (var entry in this.ChangeTracker.Entries<IDatedEntity>()) 
      { 
       var entity = entry.Entity; 
       switch (entry.State) 
       { 
        case EntityState.Added: 
         entity.Created = now; 
         entity.Updated = now; 
         break; 
        case EntityState.Modified: 
         entity.Updated = now; 
         break; 
       } 
      } 
      this.ChangeTracker.DetectChanges(); 
     }; 
    } 
} 

Nota l'ultima chiamata per DetectChanges, che farà in modo che i nuovi valori di data aggiornati sono applicato a tutte le entità modificate.

Problemi correlati