2011-08-11 149 views
3

我最近開始在Code First使用EF,並且遇到了這個讓我感到困惑的問題。我會很感激任何關於這個主題的反饋,這將有助於我解決上述問題。NHibernate'Bags'在實體框架中的實現

請考慮下面的示例....

public class SomeType 
{ 
    public SomeType() 
    { 
     Properties = new List<BaseProperty>(); 
    } 

    public int PrimaryKey { get; set; } 
    public string Name { get; set; } 
    public List<BaseProperty> Properties { get; set; } 
} 

public abstract class BaseProperty 
{ 
    public int PrimaryKey { get; set; } 
    public string PropertyName { get; set; } 

    // FK set through Type Configuration File. 
    public SomeType ParentInstance { get; set; } 
} 

public class PropertyA : BaseProperty 
{ 
    // some unique properties. 
} 

public class PropertyB : BaseProperty 
{ 
    // some unique properties. 
} 

public class PropertyC : BaseProperty 
{ 
    // some unique properties. 
} 

public class PropertyD : BaseProperty 
{ 
    // some unique properties. 
} 

所有這些工作很大與適當的類型的配置類,其地圖到2個表(1「SOMETYPE」和第二關於「BaseProperty」沿與其餘派生實體通過使用鑑別器列)。

現在,由於我無法控制的情況下,我被迫修改「SOMETYPE」到這樣的事情....

public class SomeType 
{ 
    public SomeType() 
    { 
     PropertiesAB = new List<BaseProperty>(); 
     PropertiesC = new List<PropertyC>(); 
     PropertiesD = new List<PropertyD>(); 
    } 

    public int PrimaryKey { get; set; } 
    public string Name { get; set; } 

    public List<BaseProperty> PropertiesAB { get; set; }  // collection of PropertyA and PropertyB 
    public List<PropertyC> PropertiesC { get; set; }  // collection of PropertyC 
    public List<PropertyD> PropertiesD { get; set; }  // collection of PropertyD 
} 

這將是非常非常容易使用袋NHibernate的做,但在使用Code First的EF中是否存在等同的暗示?有什麼想法嗎 ? 我不想寫我自己的集合的implimentation,它將轉發和操作這些新列表上執行的所有操作,並將其實際映射到數據庫的主列表。

請忽略任何缺少的「虛擬」修飾符或上述代碼中的任何其他內容,因爲它只是一個示例,實際上並不是我正在使用的。

謝謝你的回覆。

+0

以外使用的是什麼'BasePropertyC '和'BasePropertyD'? –

+0

哦對不起。 'BasePropertyC'和'BasePropertyD'應該分別是'PropertyC'和'PropertyD'。我的錯。 – James

+0

「PropertiesAB」呢?我可以在'PropertiesAB'中存儲'PropertyD'(我可以,因爲'PropertiesAB'是'BaseProperty'的集合,'PropertyD'是'BaseProperty'的擴展]? –

回答

0
更糟

來更糟的是,你可以做這樣的事情:

public class SomeType 
{ 
    public SomeType() 
    { 
     Properties = new List<BaseProperty>(); 
    } 

    public int PrimaryKey { get; set; } 
    public string Name { get; set; } 
    public List<BaseProperty> Properties { get; set; } 

    public List<BaseProperty> PropertiesAB 
    { 
     get 
     { 
     return Properties.Where(p=>p is PropertyA || p is PropertyB); 
     } 
     set 
     { 
     //Remove all the properties already in the Properties collection of 
     //the type A and B and then 
     Properties.AddRange(value) 
     } 
    } 
    //Same with rest of the properties 
} 

您也可以使屬性屬性內部類是否正在域層