簡體   English   中英

具有接口作為返回類型的實體框架和建模集合

[英]Entity Framework and Modeling Collections with an Interface as a return type

我正在使用Entity Framework v4。 我創建了一個包含一堆標量屬性的POCO類和一個返回Interface類型的集合。 如何在EF模型中創建此關系? 如何顯示包含不同項目的集合,但它們都具有通用界面? 這將是我想要實現的一個例子。

interface IPatientDocument{}
public class Lab : IPatientDocument{.....}
public class Encounter : IPatientDocument{...}
public class MedicationLog : IPatientDocument{...}

//Incomplete class listing
//Once I have aggregated the different doc types, I can then use Linq to Obj to retrieve the specific doc type I need.  Currently I have about 26 doc types and do not want to create a collection for each one
public class Patient
{
   IList<IPatientDocument> DocumentCollection;
}

如果您在Entity Framework中使用TPT(Table-Per-Type)繼承,請非常小心。 特別是如果你有26種doc類型。 我做了關於TPT繼承的破壞SQL生成的博客文章 ,並且還在Microsoft Connect上打開了一個錯誤 MS已經承認了這個問題,並且他們說他們正在研究它,但是不要屏住呼吸。 他們花了3個月的時間來承認這個問題,他們所說的只是“我們意識到TPT層次結構的性能問題。我們目前正在調查解決方案,並期望在未來版本中對此領域進行改進”。

使用26種doc類型,即使使用基本查詢,EF也需要將近2分鍾來生成SQL(將在8000行附近),並且SQL Server需要處理它。 在荒謬的子查詢中你將達到30級。 不惜一切代價避免TPT繼承。 如果您剛剛啟動應用程序,它似乎可以正常工作,因為您通常只有一些子類型,但是一旦添加更多,您的應用程序就會慢慢爬行。

我不知道這是否完全合法。 如果您可以使用基類實現,那么您可能正在為每個類型繼承執行表,這是允許的。 但是,如果您只是嘗試選擇任意類型,那么您將陷入共同和反向差異,這可能值得研究,因為它是.NET 4中的新功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM