插入更新 - 对象上下文中的对象值历史记录维护

本文关键字:对象 历史 记录 维护 更新 上下文 插入 | 更新日期: 2023-09-27 18:30:16

我有一个处理来自xml文件的输入的Windows服务。每次获得新文件时,我都需要插入新记录并更新现有记录。我现在需要在每次操作发生后实现插入''更新历史记录。 我需要通过显示旧值和新值在单独的表中维护它。是否有任何现有的方法或技术可用于以更简单的方式实现这一点,例如比较两个对象并识别修改后的字段。请提供任何建议。我正在使用Entityframework 5.0和sql 2012。

插入更新 - 对象上下文中的对象值历史记录维护

有多种方法可以做到这一点。

  1. 使用持久性 API 框架的拦截器。例如,JPA 或 Hibernate 框架围绕您的实体操作提供了外观,该实体操作在数据库中的 DML 操作之后运行。

  2. 事件侦听器
  3. :您应该能够在持久性框架中创建事件侦听器,该事件侦听器将被触发,并在每次 DML 操作后在历史记录表中插入历史数据。

  4. 数据库触发器:这确实是维护给定行/表的历史信息的最简单方法之一。

希望这些指针对您有所帮助阿南特

特别是对于 EF,您可以覆盖DbContext.SaveChanges()并迭代DbContext.ChangeTracker.Entries()。每个条目都包含实体属性的当前值和原始值。

我的实体类派生自ObjectContext,它没有提供获取修改后的值的ChangeTracker。但是,对于ObjectContext,我们可以使用以下DBContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)如果需要,您可以使用 EntityState.DeletedEntityState.Added。下面是示例实现

     Entities DBContext = new Entities();
        var d = DBContext.StudentTableName.Where(x => x.stname == "Stock").FirstOrDefault();
        if(d!= null)
        {
        d.Id = "345";
        DBContext.StudentTableName.ApplyCurrentValues(d);
        //Need to Include Audit Logging before  save, or can override save function.
        var entrList = DBContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
        foreach (var stateEntry in entrList)
        {
            var currentValues = stateEntry.CurrentValues;
            var originalValues = stateEntry.OriginalValues;
            var modifiedProperties = stateEntry.GetModifiedProperties();
            foreach (string modifiedProperty in modifiedProperties)
            {
                var currentValue = currentValues.GetValue(currentValues.GetOrdinal(modifiedProperty));
                var originalValue = originalValues.GetValue(originalValues.GetOrdinal(modifiedProperty));
                if (!originalValue.Equals(currentValue))
                {
                    //Perform the logging operation
                }
            }
        }
        // Audit Logging Performed
        DBContext.SaveChanges();
}