2012-01-17 113 views
7

我正在嘗試做一些應該相對容易的事情,但我不知道如何構建它。實體框架4.1 - 用過濾器覆蓋實體(DBSet)

我有一個生成的實體,我想通過添加一個Linq Where語句來重寫。

。由此部分的語境:

public partial class MyEntities: DbContext 
{ 
    public MyEntities() 
     : base("name=MyEntities") 
    { 
    }  
    public DbSet<Assignee> Assignees { get; set; } 
} 

我創建了一個新的部分MyEntities,並嘗試了以下

public override DbSet<Assignee> Assignees 
{ 
    get 
    { 
     return this.Assignees.Where(z => z.IsActive == true); 
    } 
    set; 
} 

但是,這將引發多義性錯誤(這是顯而易見的)。

我該如何做到這一點?

感謝

回答

10

嘗試揭露DbSet<Assignee>IQueryable<Assignee>不同名稱的

public partial class MyEntities: DbContext 
{ 
    public MyEntities() 
     : base("name=MyEntities") 
    { 
    } 

    public DbSet<Assignee> AssigneesSet { get; set; } 

    public IQueryable<Assignee> Assignees 
    { 
     get 
     { 
      return AssigneesSet.Where(z => z.IsActive == true); 
     } 
    } 
} 
+0

這似乎是最合乎邏輯的...不知道這是否會起作用,因爲EF仍然會生成公共DbSet Assignees {get;組; }並且不會在調用context.Assignees時使用它? – Fox 2012-01-17 07:42:29

+0

@Fox然後您可以手動更改名稱或爲'IQueryable '屬性賦予不同的名稱。 – Eranga 2012-01-17 07:50:25

+0

不錯的,它完美的作品。我只是將DbSet設置爲只顯示DbContext中的一個屬性,用於intellisense pourpose;) – 2016-10-28 10:29:01

2
public override DbSet<Assignee> Assignees 
{ 
    get 
    { 
     return base.Assignees.Where(z => z.IsActive == true); 
    } 
    set; 
} 

這你想要什麼?

+0

我不能這樣做,因爲我不是從MyEntities繼承......從DbContext繼承 – Fox 2012-01-17 07:39:40

+1

爲什麼不創建一個繼承自生成的代碼並覆蓋屬性行爲的類? – linkerro 2012-01-17 08:07:26

+0

代碼變更太多..我必須更改我的DAL中的很多代碼...雖然 – Fox 2012-01-17 08:11:20

2

您是否嘗試過在模型中加入條件的映射表?右鍵單擊edmx中的實體並選擇「表映射」。然後「添加條件」。可能是更優雅的解決方案。

+0

此方法的問題是,EF不允許爲映射的屬性添加過濾器。在此示例中,他必須從映射中刪除IsActive列,這意味着EF不會將更改保存到IsActive字段。我一直把頭靠在桌子上幾個小時試圖繞過它,但無濟於事。 – demius 2014-08-22 16:47:38

0

我知道這是超級老了,但另一種簡單而優雅的方式,在不改變任何現有的名稱,使用new關鍵字隱藏原始成員,是這樣的:

public new IQueryable<Assignee> Assignees 
{ 
    get 
    { 
     return base.Assignees.Where(z => z.IsActive == true); 
    } 
} 

只是想分享任何未來的訪客,希望它有幫助!