C# 实体框架编码单个表中的第一个多对多关系

C# 实体框架编码单个表中的第一个多对多关系,c#,entity-framework,many-to-many,code-first,C#,Entity Framework,Many To Many,Code First,我已经潜伏了很长一段时间,所以这里是第一个问题 我已经开始使用Entity Framework 5.0代码,我想做以下工作: 我有两个实体,我希望每个实体都与地址实体有以下关系: 我有一个存储地址值的地址实体,它与它有值的实体没有关系 还有另一个实体通讯簿,它引用了地址实体和共同响应实体个人、公司,以及将来的其他一些实体 以下是代码: public partial class Address : BaseEntity { [Key] public int ID { get; se

我已经潜伏了很长一段时间,所以这里是第一个问题

我已经开始使用Entity Framework 5.0代码,我想做以下工作:

我有两个实体,我希望每个实体都与地址实体有以下关系:

我有一个存储地址值的地址实体,它与它有值的实体没有关系 还有另一个实体通讯簿,它引用了地址实体和共同响应实体个人、公司,以及将来的其他一些实体 以下是代码:

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; }
}
我不知道如何在Person和Company类中定义导航属性

它们应该具有ICollection Addresses导航属性,因为我希望它们只处理地址集合,而不知道底层的AddressBook

是否可以使用DbModelBuilder执行此操作,还是应该在ICollection Addresses属性的getter和setter中编写代码,并从AddressBook中获取地址


谢谢

创建映射的方式不能使Entity Framework将个人和公司中的Addresses集合理解为真正的导航属性,这些属性支持即时加载和延迟加载等。为此,您确实需要AddressBooks集合。您可以将地址添加为未映射和只读帮助器属性,然后:

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); }
    }
}
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; }
}

谢谢你的帮助——我已经得出结论,我应该像第一个例子中那样做。我甚至编写了部分解决方案,但我不太喜欢它。我想应该有更好的办法。
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 
{
}
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; }
}