获取对Entity Framework中的对象所做的所有更改

c# entity-framework

有没有办法在保存所有更改之前获取对实体框架中的对象所做的所有更改。原因是我想在客户端数据库中创建一个日志表:

所以...

有没有办法在保存更改之前获取当前数据库值(旧)和新值(当前)?

如果没有,我怎么能以通用的方式实现这一点,所以我的所有View Models都可以继承?(我使用的是MVVM + M结构)

一般承认的答案

您可以使用ObjectContext的ObjectStateManager,GetObjectStateEntry来获取对象的ObjectStateEntry ,该对象在OriginalValuesCurrentValues属性中保存其原始值和当前值。您可以使用GetModifiedProperties方法获取已更改的属性的名称。

你可以这样写:

var myObjectState=myContext.ObjectStateManager.GetObjectStateEntry(myObject);
var modifiedProperties=myObjectState.GetModifiedProperties();
foreach(var propName in modifiedProperties)
{
    Console.WriteLine("Property {0} changed from {1} to {2}", 
         propName,
         myObjectState.OriginalValues[propName],
         myObjectState.CurrentValues[propName]);
}

热门答案

对于EF5以上,您可以在SaveChanges()方法中记录您的更改,如下所示:

    public override int SaveChanges()
    {

        var changes = from e in this.ChangeTracker.Entries()
                      where e.State != System.Data.EntityState.Unchanged
                      select e;

        foreach (var change in changes)
        {
            if (change.State == System.Data.EntityState.Added)
            {
                // Log Added
            }
            else if (change.State == System.Data.EntityState.Modified)
            {
                // Log Modified
                var item = change.Cast<IEntity>().Entity;
                var originalValues = this.Entry(item).OriginalValues;
                var currentValues = this.Entry(item).CurrentValues;

                foreach (string propertyName in originalValues.PropertyNames)
                {
                    var original = originalValues[propertyName];
                    var current = currentValues[propertyName];

                    if (!Equals(original, current))
                    {
                        // log propertyName: original --> current
                    }
                }

            }
            else if (change.State ==  System.Data.EntityState.Deleted)
            {
                // log deleted
            }
        }
        // don't forget to save
        base.SaveChanges();
    }


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因