2013-03-24 119 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

相关问题