【发布时间】:2014-03-22 01:27:46
【问题描述】:
考虑以下示例:
一个人可以有多个地址。一个商店可以有多个地址。 两者都有一个 1:M 到地址表。
使用 EF6,Code First,我如何设置我的实体和映射 (FluentApi) 来支持这一点?根据我使用 EF 1:M 的经验,子表(地址)对于其父表(Person 或 Store)来说是唯一的。我将有一个 Person Table 和一个 PersonAddressTable 具有 1:M 关系。我也会有一个 Store 和 StoreAddress 表,它们有自己的 1:M 关系。不幸的是,现有的数据模型是这样写的。
据我了解,我通过在指向父级的子实体上添加导航属性来定义 1:M 关系。子实体还必须有一个指向父实体的 ID 字段 (FK),并且此 FK 属性必须在子实体上按要求标记。
所以在我的示例中,地址实体将具有
public virtual Person Person {get;set;}
public int PersonId {get;set;
public Virtual Store Store {get;set;}
public int StoreId {get;set;
地址实体映射器将定义:
this.Property(i=>i.PersonId).IsRequired();
this.Property(i=>i.StoreId).IsRequired();
this.HasRequired(p=>p.Person)
.WithMany(c=>c.Addresses)
.HasForeignKey(c=>PersonId);
this.HasRequired(p=>p.Store)
.WithMany(c=>c.Addresses)
.HasForeignKey(c=>c.StoreId);
但根据其父级,子导航属性(Person 或 Store)将为空。当引用 Person 的地址时,Address.Store nav 属性将为 null,当引用商店的地址时,Address.person nav 属性将为 null。
如何正确定义这些关系?
谢谢。
【问题讨论】:
-
我可能错了,但我认为虚拟属性在您的地址类中是可选的。如果你想要延迟加载,你肯定需要它们。无论如何,如果您正在与一个人打交道,Addresses.Store 是否为 null 有什么关系,如果您正在与商店打交道,Addresses.Person 是否为 null 又有什么关系?
-
地址类中不应包含 PersonId 和 StoreId。只是虚拟属性很好。
-
如果地址类上没有PersonId和StoreId,如何在映射代码中指定关系? This.HasRequired(p=>p.Person) .WIthMany(c=>c.Addresses).HasForiegnKey(WHAT_GOES_HERE)?
-
我也有类似的问题。任何解决方案了吗? stackoverflow.com/questions/25042768/…
标签: c# entity-framework ef-code-first