1

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

我一直在玩 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
    • Person_ID
  • 地址公司
    • 地址_ID
    • 公司_ID
  • 人们
  • 公司

这是我想要做的:

  • 地址
  • 地址簿
    • 地址_ID (PK)
    • Person_ID (FK)
    • 公司_ID (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编写代码并从AddressBook获取地址?gettersetterICollection<Address> Addresses

谢谢!

4

1 回答 1

0

您不能以 Entity Framework 将其中的Addresses集合理解为真正的导航属性(支持急切PersonCompany延迟加载等)的方式创建映射。为此,您确实需要AddressBooks收藏。您可以添加Addressesas not mapped 和 readonly helper 属性,然后:

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。)

另一种我认为更好的方法是为Personand创建一个公共基类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; }
}
于 2013-03-24T15:37:59.973 回答