2010-01-06 47 views
8

我正在嘗試使用Entity Framework 4,POCO和Code-Only來設置項目。使用具有導航屬性的接口

是否有可能在實體框架中將導航屬性的類型作爲接口?

我有一個「任務」類。可以將任務分配給用戶或組,每個用戶由單獨的類表示並存儲在單獨的表中。這些類看起來是這樣的:

public class User : IAssignable 
{ 
    public String Name { get; set; } 
    public int ID { get; set; } 
    public String Email { get; set; } 
    public String Password { get; set; } 
} 

public class Group : IAssignable 
{ 
    public String Name { get; set; } 
    public int ID { get; set; } 
    public String Manager { get; set; } 
    public String Department { get; set; } 
} 

public class Task 
{ 
    public String Title { get; set; } 
    public DateTime DueDate { get; set; } 
    public String Details { get; set; } 
    public IAssignable AssignedTo { get; set; } 
} 

有沒有辦法可以將AssignedTo屬性作爲實體框架中的導航屬性?我假設EF必須有某種類型的鑑別器才能知道它是否需要查看用戶表或組表,但我可以使用純代碼或EDMX來計算映射。

+0

我也對這個解決方案感興趣。 – Ciel 2010-09-13 21:58:29

回答

0

通過使用EF4支持的文本模板轉換工具包(T4),您可以節省大量工作量。我發現這是一個很好的12小時尋找辦法解決手動創建我的波蘇斯和接口後,

http://blogofrab.blogspot.com/2010/08/maintenance-free-mocking-for-unit.html

除了提供單元測試輝煌的基礎,它會自動生成基於關係的導航性能在您的模型中定義。

1

我知道這是一個老問題,但沒有,沒有實體框架的特點(即使是最新的版本6),它允許您使用接口類型來映射導航屬性。

但是,您可以使用具體類型(以及只能設置一個約束的約束)映射多個導航屬性,並提供一個未映射的接口類型屬性,將具體導航屬性合併到一個屬性中。不幸的是,這可能會使你的查詢更加複雜,因爲某些查詢需要知道要引用哪個具體的導航屬性(並且你無法查詢你的未映射的接口屬性)。

支持多態導航屬性的複雜性非常高。考慮如果您假設它已映射到列(如AssignedToId int),那麼爲了查詢您的原始AssignedTo屬性將會發生什麼情況。您必須加入工會或加入UserGroup實體集,並希望給出的AssignedToId僅出現在其中一箇中。這是Table-Per-Concrete (TPC)類型映射所使用的方法,但它只適用於類繼承(不是接口),並且仔細規劃在參與類型中生成不同的id。