2017-03-24 82 views
1

我有2個班是這樣的:C#EntityFramework 6.0 - 如何在EntityTypeConfiguration中使用Where語句?

Parent.cs

public class Parent 
{ 
    public int Id {get;set;} 
    public virtual ICollection<Child> Children { get; set; } 
} 

Child.cs

public class Child 
{ 
    public int Id {get;set;} 
    public ItemStatusType ItemStatusTyp { get; set; } 
    public int ParentId {get;set;} 

    [ForeignKey("ParentId")] 
    public virtual Parent Parent { get; set; } 
} 

ItemStatusType.cs

public enum ItemStatusType 
    { 
     Active = 1, 
     Deactive = 2, 
     Deleted = 3 
    } 

我想被以某種方式獲取什麼永遠有效個而不是刪除個。由於我沒有刪除物理記錄,我只是將ItemStatusType更新爲Deleted狀態。

所以,當我說ParentObj.Children我只希望檢索活動的沒有進一步使用Where條件。

這是迄今爲止我做了什麼,但給人的運行時異常,我後來說:

public class ParentConfiguration : EntityTypeConfiguration<Parent> 
{ 
    public ParentConfiguration() 
    { 
      HasMany(c => c.Children.Where(p => p.ItemStatusTyp != ItemStatusType.Deleted).ToList()) 
       .WithRequired(c => c.Parent) 
       .HasForeignKey(c => c.ParentId) 
       ; 
    } 
} 

運行時異常:

表達式「C => c.Children。 Where(p =>(Convert(p.ItemStatusTyp) != 3))。ToList()'不是有效的屬性表達式。表達式 應表示屬性:C#:'t => t.MyProperty'VB.Net: 'Function(t)t.MyProperty'。

我不得不在表達式後使用ToList,否則它不會編譯。

什麼是正確的做什麼我想要什麼?

由於提前,

+0

你不能那樣。想象一下,如何看待數據庫,這基本上是配置設置。 – DavidG

+0

EF在這種對開發友好的糖果中一直很貧瘠。NHibernate功能非常豐富,如果不是EF的卓越LINQ支持,我幾乎可以切換。所以不,你不能用條件配置導航屬性。您可能需要使用提供全局過濾器的第三方庫或查找更復雜的方式來實施軟刪除。 –

回答

2

不能使用Where或用流利的屬性映射任何其他邏輯 - 這只是配置。

基本上你不能用聲明的方式解決你需要的東西。

有一些解決方法可以用於第一級實體,比如實現您自己的擴展MySet<T>,它將返回.Set<T>.Where(x => x.ItemStatusType != ItemStatusType.Deleted)並在任何地方使用,但這不會解決子集合的過濾問題。

你可以很努力的去準備一套單獨的實體來選擇數據,這些實體基本上應該基於數據庫視圖或存儲過程;您將不得不爲每個實體創建單獨的視圖,因此您將能夠根據這些視圖實體在任何關係中合併選擇。

對於插入,雖然您需要將實體映射到「真實」表格上。不知道它是否值得,但在某些情況下可能。

+0

這是一個恥辱..謝謝..我會嘗試你的建議立刻。 –

+0

在嘗試了更多的事情之後,我按照你的說法實施並且精美地工作。謝謝。 –

相關問題