2013-02-19 94 views
1

軟性刪除的優雅方式是什麼EntityFramework?我已經將屬性(數據庫字段)標識爲已刪除,並且始終在linq語句中使用此過濾器。對EntityFramework的邏輯刪除

Foo Class 
    int NumberField 
    string Description 
    bool Deleted 

contexts.Foos.Where(x=> !x.Deleted); 

這不是在複雜的查詢是可行的。

我只是看着這些解決方案.. Link 1Link 2

任何幫助表示讚賞..

回答

2

是的,這可能與EF via pattern。 如果您使用Fascade /存儲庫模式並通過該fa訪問每個時間SCADE。

如 所有的版本庫類的接口的實現可能是這樣的:

class MyRepositoryBase<T>.... 

    public IQueryable<T> ValidQuerySet // this is not deleted check Set 

    { get { return Context.Set<T>().Where(t => t.deleted != true); 
      } 
    } 

您將訪問就好像它是在最初DbSet。 EF將組合條件。

var myQuerySet = MyRespository<T>.ValidQuerySet.Where(t=>t.foo == "bar"); 
+0

我該如何使用這種模式與複雜的查詢?喜歡加入3桌? – hkutluay 2013-02-20 08:00:54

+0

如果不改變這一點。在這個Iqueryable方法上發送連接。 EF將結合它。我在我們的資源庫中使用這種模式,它工作正常。 – 2013-02-20 10:11:17

1

而不是直接查詢您的環境下,你可能要考慮在上下文類本身創建存儲庫(如發現this site)。

return Context.Set<Foo>().Where<Foo>(x => !x.Deleted).Where<Foo>(predicate).AsQueryable<Foo>(); 

會是怎樣更好的是,如果你:只要你查詢的記錄(例如,通過使用存儲庫的Filter<T>(Expression<Func<T, bool>> predicate)方法,你總是可以做下面的你就可以做的就是爲實現在多個對象類型軟刪除,然後扳指爲一個抽象類(稱之爲SoftDeleteable,例如),所以那麼你的篩選方法的簽名可能是:

public virtual IQueryable<T> Filter<T>(Expression<Func<T, bool>> predicate) where T : SoftDeletable 
-1

,我覺得這是非常痛苦的做「軟刪除」是這樣的:

  1. 你當你的數據訪問處處記住這個標誌。 是的,你可以將它包裹在一些存儲庫模式中,但你仍然可以在任何地方使用它。
  2. 您的表格中快速填入「已刪除」 條目,並使報告,分析效率不高。

我會建議你只是把硬刪除條目放到不同的表或數據庫中,它會爲你節省時間長期運行。

0

你可能不會喜歡我的答案,但我能想到的「不那麼痛苦」的方式需要大量的存儲過程:每個實體1個,而你所做的只是存在UPDATE foo Deleted = True。我通常看起來像這樣

PROCEDURE [dbo].[SP_Address_UnSet] 
    @ID bigint 
AS 
BEGIN 
    DECLARE @IsInactive bit 

    SELECT @IsInactive = IsInactive 
    FROM [Address] 
    WHERE AddressID = @ID 

    IF (0 = @@ROWCOUNT) 
     RETURN -1 

    -- implicit else 

    IF (1 = @IsInactive) 
     RETURN 0 

    -- implicit else 

    UPDATE [Address] 
    SET IsInactive = 1 
    WHERE AddressID = @ID 

    RETURN @@ROWCOUNT -- should be 1 
END 

然後在每個實體映射到那個SP上。

你可能有1個單一的SP,並將表名作爲參數傳遞,但由於你不能直接在T-SQL中通過動態查詢使用它,你將不得不構建子執行(並且擔心avout SQL注入!!)

Exec('SELECT * FROM ' + @tableName)