Im usando EF4 in VS2010, POCO e l'approccio del primo modello.Come aggiornare automaticamente la proprietà modificata su un'entità in Entity Framework 4 quando si salva?
La mia entità ha le seguenti proprietà: Id: Guid, Nome: String, Creato: DateTime, Modificato: DateTime, Revision: Int32.
Ho creato la mia entità, impostato il nome e salvato nel database utilizzando il contesto EF4. Questo dovrebbe impostare Id su un nuovo Guid (funziona con Identity-SGP), Creato su adesso, Modificato a sinistra come null, Revision su 0. Ritrovo l'entità, cambio il nome e lo salvi di nuovo. Questa volta il valore modificato dovrebbe essere impostato su ora e la revisione dovrebbe essere 1.
Come faccio a ottenere questo risultato utilizzando EF4 con il progettista EDMX?
Aggiornamento:
Questo era quello che ho finito per usare:
public override int SaveChanges(System.Data.Objects.SaveOptions options)
{
foreach (ObjectStateEntry entry in ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified).Where(e => e.Entity is EntityBase))
{
EntityBase entity = entry.Entity as EntityBase;
if (entry.State == EntityState.Added)
{
entity.Version = new Version() { Major = 1, Minor = 0, Revision = 0 };
entity.Created = DateTime.Now;
if (OperationContext.Current != null) entity.CreatedBy = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
}
else if (entry.State == EntityState.Modified)
{
entity.Version.Revision++;
entity.Modified = DateTime.Now;
if (OperationContext.Current != null) entity.ModifiedBy = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
}
}
return base.SaveChanges(options);
}
che costerà di lavoro ... :(
Il problema è che l'entry.State è ancora non modificato anche se eseguo esplicitamente il metodo MarkAsModified(). Non riesco a ottenere questo ...
Perché il rilevamento delle modifiche non è abilitato per impostazione predefinita? le entità di auto-tracciamento, quindi perché dovrei volerlo e accenderlo esplicitamente ogni volta? E perché le entità sono tenute a db anche se lo stato non è modificato? E qual è la differenza tra EntityState e ObjectState? Al momento sto facendo tutte le modifiche e aggiorno i server, ma userò anche un servizio WCF per trasferire le entità avanti e indietro qualche tempo dopo ... C'è una differenza nel modo in cui le modifiche vengono trattate qui? Se serveride tutte le modifiche, indipendentemente dall'attivazione/disattivazione del changetracking, vengono mantenute ?? Quello che voglio è che nulla dovrebbe mai essere in grado di essere memorizzato senza aggiornare anche Modified, Revision ecc. Queste proprietà dovrebbero sempre essere impostate sul server quando l'oggetto viene ricevuto e modificato. (Non sto parlando sql-server-side qui ma il servizio-lato server)
Grazie, proverò, ma c'è un modo per farlo sullo sql-server durante l'aggiornamento? –
Ovviamente, è possibile scrivere un "trigger" del database che aggiorna la tabella su insert e update. Questa è una soluzione per farlo sul lato client con il framework di entità. –
Ho provato il metodo, ma ho problemi a impostare una proprietà int in una proprietà ComplexType sull'entità aggiornata. Ho una versione ComplexType con tre interi e voglio solo aggiornare l'ultimo valore. L'impostazione di una nuova versione fallisce completamente con un'eccezione che mi dice che devo implementare IExtendedDataRecord. È davvero necessario? –