2012-03-06 115 views
1

所以我使用實體框架代碼優先(所以沒有的.edmx) 我有一個布爾的IsEnabled基地實體類做軟刪除的實體框架代碼優先軟刪除延遲加載

我使用存儲庫模式所以針對存儲庫的所有查詢都可以使用IsEnabled進行過濾。

但是,任何時候我使用存儲庫來獲取MyType這是IsEnabled,延遲加載MyType.Items可能意味着項目可能未啓用。

有沒有辦法,或許用EF Fluent來描述如何對錶格進行過濾?

更新:

如果我有一個Dbset

public class UnitOfWork : DbContext 
    { 
private IDbSet<MyObj> _MyObj; 
public IDbSet<MyObj> MyObjs 
     { 
      get { return _MyObj ?? (_MyObj = base.Set<MyObj>()); } 
     } 
} 

有什麼辦法,我可以告訴的DbContext過濾DbSet?

+0

更新後的答案仍然是:不。當然,你可以添加一個屬性的上下文類像'IQueryable MyFilteredObjs {get {return MyObjs.Where(m => m.IsEnabled); }}。但我認爲這不是你想要的,它不適用於懶惰或急切的加載。 – Slauma 2012-03-08 17:26:58

回答

4

不,沒有辦法爲延遲加載定義過濾器(也不能用於使用Include進行加載)。如果您希望您的導航集只能獲得物品填充,其中IsEnabledtrue你只能用明確的加載相應的塑造你的查詢,例如:

context.Entry(parent).Collection(p => p.Items).Query() 
    .Where(i => i.IsEnabled) 
    .Load(); 

這將填充Items收集parent只與啓用的項目。

編輯

我覺得有點像約敗仗誰得到他的頭壞消息的信使弄掉。也許很難相信Entity Framework有時沒有你想要的功能。爲了提高我的機會來說服你,我添加quote from an authority, Julie Lerman

無論是預先加載,也沒有延遲/延遲加載的實體 框架可以過濾或相關的數據是 返回排序。

+0

這是一個恥辱,我希望有一種方法可以將它推薦給EF團隊。 – maxfridbe 2012-03-10 19:24:41

+1

@maxfridbe:實際上你可以在這裏提出一個功能請求:http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions我已經看到有一個請求允許用'Include'(急切加載)(在請求列表中放置8)過濾,但我沒有看到這樣的延遲加載請求。 – Slauma 2012-03-11 17:13:30

+0

嗨,感覺就像我在這裏晚了,然而給出的解決方案很好乾淨。這樣的事情有什麼問題。 var parent.items = context.Items.Where(x => x.parent_id == parent.parentID && x.IsEnabled == true).ToList();所以我使用的是parentID,我正在設置我想要的項目。 – 2016-07-13 09:25:26

0

這個http://blogs.claritycon.com/blog/2012/01/25/a-smarter-infrastructure-automatically-filtering-an-ef-4-1-dbset/基本上定義了我可以如何實現我正在尋找的東西。

基本上你創建一個FilteredDbSet並讓你所有的DbContext IDbSet都返回它。

+1

這不是您自己問題的答案。此FilteredDbSet對延遲加載沒有影響,但僅對父實體的查詢有效。你已經問過你如何將過濾器應用到被延遲裝載的物品上。關於*這個問題,我認爲我的答案(我現在編輯的)仍然有效。 – Slauma 2012-03-08 20:27:59

+0

FilteredDbSet讓我成爲我的一半。我討厭這樣說,但我也添加了頑固的集合到我的dmain中,如[NotMapped] ActiveMyObjs {return MyObjs.Where ... 沒有辦法強制使用,但確實有效。 – maxfridbe 2012-03-10 19:26:51

1

看起來它仍然是可能的。如果你感興趣,你可以看看Wiktor Zychla blogpost,他提供了一個軟刪除問題的解決方案。