2012-04-26 36 views
1

我有一個帶有實體數據模型的WPF應用程序。如何使用實體數據模型進行軟刪除

我想在刪除實體而不是從數據庫中刪除時將IsDeleted標誌設置爲true。

我在這裏讀了很多線程,很多線程都建議使用帶有條件映射的修改函數映射。

我用條件映射過濾IsDeleted = true行,效果很好。

但是,雖然我想使用修改函數映射只是刪除函數,程序給我錯誤,試圖找到插入和更新函數以及SaveChanges()方法。

我只爲刪除功能指定。有沒有辦法只使用刪除修改功能,而不是所有的插入,更新,刪除?

如果不是,還有其他方法可以實現嗎?附:我讀了關於使用而不是刪除觸發器。但是,如果可能的話,我想避免它,因爲我們正在開發移動應用程序,觸發器可能會減慢應用程序的速度。

預先感謝您!

+0

是一個請將isDeleted數據庫列,或者僅僅是一個應用程序的概念? – Tyrsius 2012-04-26 21:05:05

+0

它們是數據庫列。但是,我沒有將它們映射到實體數據模型中的實體屬性,但是我將它們用於EDM中每個實體的條件映射以過濾掉已刪除的項目。謝謝 – Chikakow 2012-04-27 13:43:48

+0

相關的主題在這裏。 http://stackoverflow.com/questions/7430286/how-do-i-override-deleteobject-in-entity-framework Ladislav在這裏討論修改函數映射。這就是我遇到的麻煩。任何幫助都會很棒。謝謝! – Chikakow 2012-04-27 13:49:44

回答

1

我們在Entity Framework 4.1解決方案中實現了軟/邏輯刪除。

我在部分這個答案描述的那樣: Partial Answer

首先,我們需要一個軟或邏輯刪除數據庫添加了一個列請將isDeleted所有表。在模板中,我添加繼承到IEnforceLogicalDelete接口

public interface IEnforceLogicalDelete 
    { 
     global::System.Boolean IsDeleted{ get; set; } 
    } 

在範本中的實體被定義我們加入這一行:

if(entity.Properties.Where(p => p.DeclaringType == entity && (p.Name == "IsDeleted")).ToList().Count == 1){#>, IEnforceLogicalDelete<#} 

這增加了接口實體從EntityObject繼承後。

一旦設置好了,現在是時候在Context上創建自己的保存方法,這是我們所做的,或者在Context.OnSavingChanges事件中。

正如我上面說我們創建了自己的方法(SaveChangesWithHistory),我們也將記錄所有更改(插入,更新和刪除)到歷史表。

要進行邏輯刪除,您需要捕獲所有狀態條目的EntityState已刪除,將其狀態更改爲已修改,並設置您的標誌。從界面實現可以很容易地對任何需要它的實體進行完全刪除。

foreach (ObjectStateEntry entry in this.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Deleted | EntityState.Added)) 
     { 

      if (entry.State == EntityState.Deleted) 
      { 
       if (entry.Entity is IEnforceLogicalDelete) 
        { 
         IEnforceLogicalDelete delete = entry.Entity as IEnforceLogicalDelete; 
         entry.ChangeState(EntityState.Modified); 
         entry.ApplyOriginalValues(delete); 
         delete.IsDeleted = true; 
        } 
       } 

}

相關問題