Sto guardando utilizzando Entity Framework 6.1.1 con SQL Server 2008 R2.
Attualmente sto creando i miei modelli e il mio database utilizzando la funzionalità EF prima del codice. Il mio caso d'uso di base è quello di creare un diario di tutte le modifiche a una particolare entità (l' ID
è la colonna chiave) per aiutare gli auditor a tenere traccia di tutte le modifiche apportate e da chi. per esempio:
|ID|Version|Created Date|Created By|Modified Date|Modified By|Modify Action| ... (rest of entity fields)
-------------------------------------------------------------------------------------------------------
| 4| 12 | 12-Mar-14 | tom | 20-Feb-15 | jack | Update |
| 4| 11 | 12-Mar-14 | tom | 14-Feb-15 | jill | Update |
| 4| 1 | 12-Mar-14 | tom | 12-Mar-14 | tom | Create |
Entity Framework supporta questo tipo di schema di database? In tal caso, come posso impostare i miei modelli / soluzione per facilitare questo?
L'altra alternativa che ho è intercettando tutte le chiamate al metodo SaveChanges()
su DbContext
e registra tutte le modifiche del database in una tabella di Audit
separata, ma ciò potrebbe rendere più difficile il recupero delle informazioni.
Qualsiasi aiuto nella creazione di audit trail con SQL Server e EF 6 sarebbe molto apprezzato.
Ho usato il secondo approccio che hai citato, sovraccaricando il metodo dbContext SaveChanges ():
public class MyContext : DbContext
{
public int SaveChanges(int userId)
{
// Get all Added/Deleted/Modified entities (not Unmodified or Detached)
foreach (var ent in this.ChangeTracker.Entries().Where(p => p.State == EntityState.Added
|| p.State == EntityState.Deleted || p.State == EntityState.Modified))
{
foreach (AuditLog x in GetAuditRecordsForChange(ent, userId))
{
this.AuditLogs.Add(x);
}
}
return base.SaveChanges();
}
...
Quindi, se voglio registrare una particolare entità, chiamo semplicemente le SaveChanges sovraccaricate e passiamo in un UserId:
public void Update(StockCatalogueItem entity, int userId)
{
_context.SaveChanges(userId);
}
Ho anche un attributo DoNotLog
personalizzato che uso per decorare le proprietà dell'entità che non voglio registrare. Senza questo, la registrazione potrebbe generare un'enorme quantità di dati, poiché ogni modifica di entità equivale a una voce db.
[DoNotLog]
public int CreatedBy { get; set; }
Il metodo GetAuditRecordsForChange
esegue il controllo di qualsiasi proprietà DoNotLog
e restituisce un List<AuditLog>
che viene salvato nella tabella AuditLogs:
public class AuditLog
{
public int Id { get; set; }
public int CreatedBy { get; set; }
public DateTime CreatedOn { get; set; }
public AuditEventType EventType { get; set; }
public string TableName { get; set; }
public int EntityId { get; set; }
public string ColumnName { get; set; }
public string Controller { get; set; }
public string Action { get; set; }
public string IPAddress { get; set; }
public string OriginalValue { get; set; }
public string NewValue { get; set; }
}