簡體   English   中英

實體框架代碼在單個表中的第一個多對多關系

[英]Entity Framework Code First Many to Many relationship(s) in single table

我已經潛伏了一段時間,所以這是第一個問題;)

我一直在使用Entity Framework 5.0 Code First,並且要執行以下操作:

我有兩個實體,並且我希望每個實體都通過以下方式與地址實體相關:

  • 我有一個存儲地址值的地址實體,它與具有值的實體沒有關系
  • 還有另一個實體AddressBook ,它引用了Address實體和相應的核心實體( PersonCompany ,將來還會有其他實體)

這是代碼:

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(帶有復合主鍵)
    • 地址ID
    • 人名
  • 地址公司
    • 地址ID
    • 公司編號
  • 公司介紹

這是我想做的:

  • 地址
  • 地址簿
    • Address_ID(PK)
    • 人名(FK)
    • 公司編號(FK)
  • 公司介紹

我想做的就是像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; }
}

我不確定如何在PersonCompany類中定義導航屬性。

它們應該具有ICollection<Address> Addresses導航屬性,因為我希望它們僅在不知道底層AddressBook的情況下僅處理地址集合。

是否可以使用DbModelBuilder做到這一點,還是應該在ICollection<Address> Addresses屬性的gettersetter內編寫代碼並從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相同。)

在我看來,另一種替代的方法是,為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; }
}

暫無
暫無

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

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