Ho un requisito che sembra aver probabilmente una soluzione più semplice con EF rispetto a quello che stiamo attualmente utilizzando.
Essenzialmente, come requisito di auditing, per qualsiasi entità che eredita da una determinata classe base, ho bisogno di creare sia la tabella dell'entità stessa, ma anche una tabella identica, ma con 3 colonne aggiuntive - una FK indietro alla tabella dell'entità originale, una descrizione (ad esempio "Modificato", "Aggiunto", "Eliminato") e una colonna XML che conterrà una versione serializzata dello stato dell'entità.
Al momento stiamo aggiungendo manualmente le entità per creare le tabelle di controllo (attualmente ereditate da una classe AuditableEntity e gli sviluppatori devono garantire manualmente che altri campi corrispondano all'entità originale) e utilizzando le migrazioni per aggiungere trigger T-SQL alle tabelle delle entità a aggiornare i dati nelle tabelle di controllo su qualsiasi inserimento, aggiornamento, cancellazione.
Preferirei se potessi in qualche modo ottenere EF per creare / migrare automaticamente le tabelle di controllo in base alle tabelle di entità senza doverle sincronizzare manualmente, e allo stesso modo usare un intercettore o qualcosa di simile per aggiornare la tabella di controllo su insert / update / delete di un'entità piuttosto che usare i trigger. Qualcuno sa se questo è possibile, o fatto qualcosa di simile? In passato, il più vicino possibile è una singola tabella di cronologia di audit comune, che non era male.
Disclaimer : sono il proprietario del progetto Entity Framework Plus
Questo progetto può rispondere alle tue esigenze. Puoi accedere a tutte le informazioni di controllo come nome dell'entità, nome dell'azione, nome della proprietà, valori originali e correnti, ecc.
Sono disponibili molte opzioni come un salvataggio automatico di tutte le informazioni nel database.
// using Z.EntityFramework.Plus; // Don't forget to include this.
var ctx = new EntityContext();
// ... ctx changes ...
var audit = new Audit();
audit.CreatedBy = "ZZZ Projects"; // Optional
ctx.SaveChanges(audit);
// Access to all auditing information
var entries = audit.Entries;
foreach(var entry in entries)
{
foreach(var property in entry.Properties)
{
}
}
Documentazione: EF + Audit
Potresti creare una tabella con le colonne:
Quindi eseguire l'override di SaveChanges () per scrivere ogni modifica su quella tabella.
Non c'è bisogno di scherzare mantenendo aggiornato lo schema della tabella Audit quando si eseguono migrazioni, ecc