创建审核历史记录的 c# 实体框架

本文关键字:实体 框架 记录 历史 创建 | 更新日期: 2023-09-27 18:35:34

我正在使用实体框架来构建一个基本存储库来添加/删除/更新客户记录。

想要的一件事是能够进行客户行审核,以便我有第二个表 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);
        }
    }

创建审核历史记录的 c# 实体框架

获取条目并将其保存到列表中,然后保存更改,将base.SaveChanges()调用的结果存储在变量中,然后浏览您创建的更改列表并从中创建审计实体,然后return base.SaveChanges() + yourPriorSaveChangesResultVariable;

@Rob G 的答案虽然已经解决了目的,但这里的审计是通过两个事务完成的。第一个是将客户行和第二个事务与客户 ID 插入到客户审计表。

我认为最好在这些表中与 CustomerId 创建一个外键关系,也会为 CustomerAudit 表生成相同的 ID,并且在同一事务中也是如此。

我是向堆栈溢出分享我的想法的新手,但从中获得帮助的时间很长。

如果有的话,请发表评论。