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.
fonte
2014-07-06 19:29:12
@Patrick: Salve, desidero assegnare la data del server al campo UpdateDate quando si utilizza context.SaveChanges(), dopo aver aggiornato il record. – cristianqr
Vedere: http://stackoverflow.com/questions/3879011/entity-framework-sql2008-how-to-automatically-update-lastmodified-fields-for-e – alvonellos
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à. –