2013-03-24 104 views
1

我一直潛伏在很長一段時間,所以這裏的第一個問題,很多關係(一個或多個);)實體框架代碼優先許多在單個表

我一直在玩實體框架5.0的Code First我想要做如下:

我有兩個實體,我想每一個實體有關聯的下列方式處理實體:

  • 我有一個地址存儲地址值實體,它與實體沒有關係爲它具有價值,而不是
  • 還有一個實體通訊錄具有參考地址實體和coresponding實體(公司,另一些人在未來)

這裏的代碼:

public partial class Address : BaseEntity 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Street { get; set; } 
    public string CityName { get; set; } 
    public int? PostalCode { get; set; } 

    public virtual ICollection<Person> Persons { get; set; } 
    public virtual ICollection<Company> Companies{ get; set; } 
} 

public partial class Person : BaseEntity 
{ 
    [Key] 
    public int ID { get; set; } 
    public virtual ICollection<Address> Addresses { get; set; } 

} 

public partial class Company: BaseEntity 
{ 
    [Key] 
    public int ID { get; set; } 
    public virtual ICollection<Address> Addresses { get; set; } 
} 

什麼將這個做的是創建數據庫架構與表:

  • 地址
  • AddressPerson(具有複合主鍵)
    • ADDRESS_ID
    • PERSON_ID
  • AddressCompany
    • ADDRESS_ID
    • COMPANY_ID
  • 人民
  • 公司

這就是我想做的事:

  • 地址
  • 通訊錄
    • ADDRESS_ID(PK)
    • PERSON_ID(FK)
    • COMPANY_ID(FK)
  • 人民
  • 公司

我想要做的是有表所示通訊錄

public partial class AddressBook 
{ 
    [Key] 
    public int ID { get; set; } 
    public virtual Address Address { get; set; } 
    public virtual Person Person { get; set; } 
    public virtual Company Company { get; set; } 
} 

我不知道如何定義導航屬性公司類。

他們應該有ICollection<Address> Addresses導航屬性,因爲我希望他們只需收集地址而不知道底層的地址地址簿

是否有可能與DbModelBuilder要做到這一點,或者我應該寫代碼裏面getterICollection<Address> Addresses財產setter,並得到地址從通訊錄

謝謝!

回答

0

不能創建的方式,實體框架會理解PersonAddresses收藏和Company爲真正的導航性能(支持急切和懶惰加載等)的映射。爲此,您的確需要AddressBooks集合。您可以添加Addresses不映射和只讀輔助性質,則:

public partial class Person : BaseEntity 
{ 
    [Key] 
    public int ID { get; set; } 
    public virtual ICollection<AddressBook> AddressBookEntries { get; set; } 

    public IEnumerable<Address> Addresses 
    { 
     get { return AddressBookEntries.Select(ab => ab.Address); } 
    } 
} 

(同樣與Company。)

的替代,在我看來更好的方法是創建一個公共基類PersonCompany,移動Addresses收集到該基類,有這個基類和Address之間的單一許多一對多的關係,單個連接表:

public abstract class EntityWithAddresses : BaseEntity 
{ 
    [Key] 
    public int ID { get; set; } 
    public virtual ICollection<Address> Addresses { get; set; } 
} 

public partial class Person : EntityWithAddresses 
{ 
} 

public partial class Company : EntityWithAddresses 
{ 
} 

Address具有導航收集到新的基類:

public partial class Address : BaseEntity 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Street { get; set; } 
    public string CityName { get; set; } 
    public int? PostalCode { get; set; } 

    public virtual ICollection<EntityWithAddresses> EntityWithAddresses { get; set; } 
} 
+0

感謝您的幫助 - 我得出結論,我應該做的事情就像在第一個例子。我甚至編寫了解決方案的一部分,但我不太喜歡它。我認爲應該有更好的辦法。 – dpihac 2013-03-24 16:57:22