【问题标题】:c# Entity Framework creating audit historyc# Entity Framework 创建审计历史
【发布时间】:2013-10-16 15:45:33
【问题描述】:

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

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

【问题讨论】:

  • 另一个解决方案,现在可能对您不切实际,因为您已经创建了模型,将PK 类型从int 更改为GUIDGUID会在实例化Customer实体时生成,你会提前知道会有什么值(customer.Id == '4705b72f-1e5b-4d0c-90d9-c235750f8b13')

标签: c# entity-framework


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    @Rob G 的回答虽然已经解决了目的,但这里的审计是在两个事务中完成的。第一个是将Customer行和带有CustomerId的第二个事务插入到CustomerAudit表中。

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

    我是新来的,在 stackoverflow 上分享我的想法,但从中获得帮助已经很长时间了。

    如果有请评论。

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 2021-08-19
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多