[英]Entity Framework Code First Many to Many relationship(s) in single table
我已經潛伏了一段時間,所以這是第一個問題;)
我一直在使用Entity Framework 5.0 Code First,並且要執行以下操作:
我有兩個實體,並且我希望每個實體都通過以下方式與地址實體相關:
這是代碼:
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; }
}
這將使用表創建數據庫架構:
這是我想做的:
我想做的就是像AddressBook這樣的表:
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; }
}
我不確定如何在Person和Company類中定義導航屬性。
它們應該具有ICollection<Address> Addresses
導航屬性,因為我希望它們僅在不知道底層AddressBook的情況下僅處理地址集合。
是否可以使用DbModelBuilder
做到這一點,還是應該在ICollection<Address> Addresses
屬性的getter
和setter
內編寫代碼並從AddressBook獲取地址?
謝謝!
您不能以實體框架將“ Person
和“ Company
的“ Addresses
集合理解為真正的導航屬性的方式來創建映射(該屬性支持緊急加載和延遲加載等)。 為此,您確實需要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
相同。)
在我看來,另一種替代的方法是,為Person
和Company
創建一個通用基類,將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; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.