1

使用每種類型的表繼承模型和實體框架代碼首先,我試圖加載一個派生類的列表。請注意,我無法更改模型。實體框架急切加載每種類型的表繼承派生類

我有以下的模型(過於簡化)

public class Training 
{ 
    public string Name { get; set; } 
    public IList<Person> Persons { get; set; } 
} 
public abstract class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

[Table("Students")] 
public class Student : Person 
{ 
    public string StudentNumber { get; set; } 
    public IList<Training> Trainings { get; set; } 
} 
[Table("Instructors")] 
public class Instructor : Person 
{ 
    public DateTime StartingDate { get; set; } 
    public IList<Training> Trainings { get; set; } 
} 

我想的名字,並渴望負荷查詢培訓所有的人,包括派生類(學生和教師)。早在2011年4月,Tom Dykstra seemed to claim it wasn't possible

當導航屬性位於TPH繼承結構的派生類上時,實體框架的當前版本不支持一對一或一對一關係的急切加載。

這個改變了嗎?我正在使用EF5。

回答

2

我不明白爲什麼...

var list = context.Trainings.Include(t => t.Persons) 
    .Where(t => t.Name == someName) 
    .ToList(); 

...不應該工作。 EF應該使用具體的StudentInstructor實體填充Persons列表。

你既不具有「一到零或一的關係」,也不是你的導航性能(Training.Persons)「在派生類」。所以,我認爲上述限制不適用於您的模型和查詢。

+0

我想,派生類的導航屬性是什麼意思是IList 培訓(我忘了在我的問題中最初添加)是在講師和學生類,而不是Person類。人與教師/學生之間的關係不是一對一或一對一的關係!? –

+0

至於包含,我假設你絕對不得不爲包含學生和講師類的數據以急切的負載出於某種原因。有用。謝謝! –

+0

@ Nick-ACNB:是的,它是數據庫架構級別上的一對一或一對一的關係。但它不是EF與參考導航屬性的明確關係(它在TPT映射中以某種方式「隱藏」)。我認爲提到的限制只意味着這種明確的關係。 – Slauma

相關問題