【发布时间】:2018-01-02 15:31:44
【问题描述】:
我想存储一个地址,但它必须是可选的。
我的映射如下所示:
map.OwnsOne(x => x.Address, cb => cb.OwnsOne(l => l.Location));
但是当我将我的 DbContext 与 Address as null 提交时,我得到了这个错误:
InvalidOperationException: 'Member' 的实体正在共享表 'Members' 与 'Member.Address#StreetAddress',但没有实体 具有相同键值 'Id:-2147480644' 的这种类型 标记为“已添加”。
然后我从构造函数中实例化了地址和位置,现在我可以保存实体了。但是当再次获取数据时,我也得到了一个实例化的地址,我真的想要一个空值。
难道不能创建可以为空的 Owned Types 吗?
【问题讨论】:
-
您有什么理由使用流畅的 API 映射而不是属性映射?成员可以有一个地址,但每个地址都必须属于一个成员。确保您的 Address 类中有一个 MemberId(外键),并确保您的 Member 类中有一个
public virtual Address Address { get; set; }- 警告:这是未经测试的。 -
简短的回答是否定的。拥有的类型与 EF6 复杂类型非常相似,是必需的,并且始终作为拥有者数据的一部分加载。
-
@BKSpureon:我喜欢保持我的域对象干净并且映射在它自己的文件中分离。我希望地址分布在实体上的列上,例如 Address_Streetname、Address_City 等,所以不需要成员的参考 ID?也许我想为订单实体添加地址字段。
-
@IvanStoev:我明白了,今天早上找到了一些文档。 docs.microsoft.com/en-us/dotnet/standard/…
-
有什么建议可以让我拥有像地址这样使用表拆分并允许空值的值类型?