【问题标题】:Insert\Update - object values history maintenance in ObjectContextInsert\Update - ObjectContext 中的对象值历史维护
【发布时间】:2015-01-11 11:08:07
【问题描述】:

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

【问题讨论】:

    标签: c# sql entity-framework audit


    【解决方案1】:

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

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

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

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

    希望这些建议对您有所帮助 阿南特

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我的实体类是从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();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-18
          • 1970-01-01
          • 1970-01-01
          • 2016-01-13
          • 1970-01-01
          相关资源
          最近更新 更多