2015-11-18 49 views
0

我要問的主要問題是類別:實體框架 - 包括對來自基地DBSet衍生

有沒有辦法讓一個DbSet基於關閉的基類,還支持預先加載的派生對象在一個只需要一個Id的檢索方法?答案可能是你不能。我只是希望我能忽略一些東西。

考慮以下情況:

//Models 
public class Base { 
    public int Id {get;set;} 
    public string BaseProp {get;set;} 
} 

public class Derived : Base { 
    public string DerivedProp {get;set;} 
} 

//Context 
DbSet<Base> Bases {get;set;} 

//Saving 
public void Save(Base obj){ 
    // Adding only for brevity 
    context.Bases.Add(obj) 
    context.SaveChanges(); 
} 

//Retrieval 
public Base Retrieve(int id){ 
    return context.Bases.FirstOrDefault(x => x.Id == id); 
} 

EF6是足夠聰明,知道什麼時候基本對象是實際導出的對象並填充上保存更多的領域以及檢索對象作爲派生的對象。

但是,如果我改變派生類是:

public class Derived : Base { 
    public string DerivedProp {get;set;} 
    public ICollection<SomeLookup> Lookup {get; set;} // Creates junction table with Id/LookupId as columns 
} 

我仍然可以保存(並與所選擇的查找精美填充結表),但我不再能檢索完整的對象我的Base DbSet,因爲我無法將其更改爲有一個Base不知道存在的集合。

所以它會延遲加載時,映射發生了線,我可以虛擬化的集合,但我不知道,這是根本的問題:


更新:基本上所有我想要要知道的是,如果我只有一個Id來處理我的檢索,下面的工作不會奏效,但是有沒有像這樣的工作?

context.Bases.Include(x => ((Derived)x).Lookup).FirstOrDefault(x => x.Id == id) 

用例是我有一個列表頁面。該頁面不需要關心它是什麼類型,因爲它只有基本屬性。我應該進入其中一個編輯頁面,服務器只能通過Id。

如果這是在檢索後構建DTO時發生這種情況的唯一方式,我會解決延遲加載問題,但我想知道是否有一些我不知道的有關modelBuilder的EF配置或一種寫一個項目查詢的方法,我還沒有找到,它允許對該Derived Lookup集合的Eager Load?

更新2:接受的答案基於他讓我知道我不能做我希望的。還發現this on the EF uservoice

+0

可以顯示從數據庫獲取數據的代碼嗎?當你獲得基本的dbset並且需要派生導航屬性時,什麼是用例? –

+0

@KirillBestemyanov我對問題做了更新。這很可能允許延遲加載是好的,我只是在這裏沒有理由的過早優化(誰知道,結果SQL可能會更糟)。我更加好奇的是,如果這樣的事情能夠真正起作用,因爲我甚至驚訝Base&Derived的工作以及它開箱即用。 –

+1

你知道當前id的派生類型嗎?如果是的話,你可以使用通用設置

回答

1

本質上,我想知道的是,如果我只有一個ID來處理我的檢索,下面的工作不會,但是有沒有像這樣?

如果您的派生對象使用某種類型的實體框架繼承; Mapping the Table-Per-Type (TPT) InheritanceMapping the Table-Per-Hierarchy (TPH) InheritanceMapping the Table-Per-Concrete Class (TPC) Inheritance

然後

db.Bases 
    .TypeOf<Derived>() 
    .Include(d => d.Lookup) 
    .Where(d => d.Id = someId) 
    .ToList(); 

否則沒有

+0

我花了一些時間擺弄那些,似乎沒有適合。奇怪,因爲我不認爲我做了什麼特別的事情,所以會認爲我會是默認的。 TypeOf 剛結束時返回空值時,Id是一個基地。這就是說,欣賞這種洞察力,因爲它看起來不太可能,因爲我也找到了這個:https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1249289 -eager-loading-for-properties-derived-classes –

+0

所以你正在使用那些受支持的繼承類型之一? –

+0

我想我有一點點交叉。我有TPH與一些通用的基本屬性,但TPT的真正的類型不是抽象的差異。樣式的合併仍然可以讓我做非常簡單的實體linq查詢,只是遺漏了這一點的衍生包括哪些顯然不支持。非常感謝洞察力。 –