我正在使用实体框架来构建一个基本存储库来添加/删除/更新客户记录。
我想要的一件事是能够进行客户行审计,以便我有第二个表 CustomerAudit 应该在每次添加/更新/删除行时添加一个条目。在旧的 wyrld 中,这将通过更新/删除/插入等时的数据库触发器来完成。现在,我试图通过覆盖 DBContext 对象的 SaveChanges() 方法,利用 ChangeTracker 对象并使用它来完成根据当前日期时间保存/更新的数据创建审计记录,并将其插入实际行旁边。代码如下。
我遇到的问题是,当您更新或删除时,这工作正常,因为它将最新记录写入审计表,该表将具有更新值或删除前的最终值,以及此活动发生时的当前时间戳.
但是,当您添加一条记录时,它会在审计表中插入一条记录,但是由于尚未插入实际行(使用身份插入),您还没有 CustomerId,因此它会插入一条包含正确数据的审计记录,但是CustomerId 为 0,这不利于审计。
关于如何让审计工作以添加记录的任何想法?
public class CustomerDbContext : DbContext
{
public CustomerDbContext()
{
Database.SetInitializer(new CreateDatabaseIfNotExists<CustomerDbContext>());
}
public DbSet<Customer> Customers { get; set; }
public DbSet<CustomerAudit> CustomerAudits { get; set; }
public override int SaveChanges()
{
// Get all Added/Deleted/Modified entities (not Unmodified or Detached)
foreach (var ent in ChangeTracker.Entries().Where(p => p.State == System.Data.EntityState.Added || p.State == System.Data.EntityState.Deleted || p.State == System.Data.EntityState.Modified))
{
var auditRecord = GetAuditRecord(ent);
if (auditRecord != null)
CustomerAudits.Add(auditRecord);
}
// Call the original SaveChanges(), which will save both the changes made and the audit records
return base.SaveChanges();
}
private static CustomerAudit GetAuditRecord(DbEntityEntry dbEntry)
{
var changedRecord = dbEntry.Entity as Customer;
return changedRecord == null ? null : new CustomerAudit(changedRecord);
}
}