我要問的主要問題是類別:實體框架 - 包括對來自基地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。
可以顯示從數據庫獲取數據的代碼嗎?當你獲得基本的dbset並且需要派生導航屬性時,什麼是用例? –
@KirillBestemyanov我對問題做了更新。這很可能允許延遲加載是好的,我只是在這裏沒有理由的過早優化(誰知道,結果SQL可能會更糟)。我更加好奇的是,如果這樣的事情能夠真正起作用,因爲我甚至驚訝Base&Derived的工作以及它開箱即用。 –
你知道當前id的派生類型嗎?如果是的話,你可以使用通用設置 –