我已經使用了ApplyCurrentValues。何時在實體框架4中使用ApplyOriginalValues?
但並不真正瞭解ApplyOriginalValues。它與ApplyCurrentValues有什麼不同?我應該什麼時候使用它?
我已閱讀文檔。但仍然困惑。
我已經使用了ApplyCurrentValues。何時在實體框架4中使用ApplyOriginalValues?
但並不真正瞭解ApplyOriginalValues。它與ApplyCurrentValues有什麼不同?我應該什麼時候使用它?
我已閱讀文檔。但仍然困惑。
從數據庫加載每個實體保持兩組值 - 原(那些裝形式DB)和電流(那些你正在修改)。這兩套保存在ObjectStateEntry
。通常,每次保存後都會接受採用當前值並將其寫入原始值的更改。如果您知道您對EF以外的實體進行了更改(例如通過使用通用ADO.NET EF調用存儲過程),則可以強制EF知道這些更改,而無需使用ApplyOriginalValues
重新加載該實體。我認爲使用這種方法很少見。例如,我在this answer中使用了ApplyOriginalValues
。
調用兩種方法似乎依賴於原有的實體或更新的實體是否被連接。 http://msdn.microsoft.com/en-us/library/bb896248.aspx
我剛剛用於使用ApplyOriginalValues()方法中軟刪除或邏輯刪除場景。
我們正在使用實體框架4.1和當上下文保存更改已實現的邏輯/軟刪除。
下面的代碼檢查以查看是否該實體被刪除,然後檢查,看它是否實現了適當的接口。如果是這樣,我們將實體狀態從已刪除更改爲已修改,並應用原始值(entry.ApplyOriginalValues()),並設置已刪除的標誌。
if (entry.State == EntityState.Deleted)
{
if (entry.Entity is IEnforceLogicalDelete)
{
IEnforceLogicalDelete delete = entry.Entity as IEnforceLogicalDelete;
ObjectStateManager.ChangeObjectState(entry.Entity, EntityState.Modified);
entry.ApplyOriginalValues(entry.Entity);
delete.IsDeleted = true;
}
}
最初我們遇到了一個問題,導航屬性在邏輯刪除時被設置爲NULL或空。 ObjectContext.DeleteObject()方法在觸發Context.SavingChanges()事件之前將所有導航屬性標記爲刪除。將狀態從刪除狀態更改爲已修改狀態時,外鍵屬性仍被擦除。我試圖爲RevertDelete()方法找到一個鉤子(ILSpy非常有用),但ApplyOriginalValues()工作。
非常好!謝謝。 – 2011-04-08 07:08:48