c# Entity Framework 创建审计历史

标签 c# entity-framework

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

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

最佳答案

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

关于c# Entity Framework 创建审计历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19407879/

相关文章:

c# - 数据透视表聚合的 Excel 性能

c# - XmlException : The input document has exceeded a limit set by MaxCharactersFromEntities

c# - 保护 .NET 代码免受逆向工程?

c# - 如何减少提取文件所需的时间?

c# - 带有 3 个外键的 EF 链接表

c# - 实体的主键字段设置为 0 而不是 null

ios - 无法将 Carthage 框架链接到 Xcode 项目

sql - 在 Entity Framework 中,创建投影而不是选择完整实体是否更有效/更受欢迎?

c# - 知道文件何时在 Windows 8 上更改

c# - Entity Framework ,查询中未映射属性