2011-04-07 34 views

回答

14

從數據庫加載每個實體保持兩組值 - 原(那些裝形式DB)和電流(那些你正在修改)。這兩套保存在ObjectStateEntry。通常,每次保存後都會接受採用當前值並將其寫入原始值的更改。如果您知道您對EF以外的實體進行了更改(例如通過使用通用ADO.NET EF調用存儲過程),則可以強制EF知道這些更改,而無需使用ApplyOriginalValues重新加載該實體。我認爲使用這種方法很少見。例如,我在this answer中使用了ApplyOriginalValues

+0

非常好!謝謝。 – 2011-04-08 07:08:48

1

我剛剛用於使用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()工作。