我們在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;
}
}
}
是一個請將isDeleted數據庫列,或者僅僅是一個應用程序的概念? – Tyrsius 2012-04-26 21:05:05
它們是數據庫列。但是,我沒有將它們映射到實體數據模型中的實體屬性,但是我將它們用於EDM中每個實體的條件映射以過濾掉已刪除的項目。謝謝 – Chikakow 2012-04-27 13:43:48
相關的主題在這裏。 http://stackoverflow.com/questions/7430286/how-do-i-override-deleteobject-in-entity-framework Ladislav在這裏討論修改函數映射。這就是我遇到的麻煩。任何幫助都會很棒。謝謝! – Chikakow 2012-04-27 13:49:44