獲取對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();
    }


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因