指向拥有的实体类型时,为什么不能使用HasOne()?

时间:2019-09-02 10:46:33

标签: c# entity-framework-core domain-driven-design

我有一个汇总根(产品),除其他外,还有一个价值对象(ProductIdentifiers)列表。为了将值对象列表存储在单独的数据库表中,我使用EF Core 2.2的OwnsMany()方法。不同的AR(设备)还具有值对象(设备标识符)列表。在DeviceIdentifier的模型中,我想指向ProductIdentifier来弄清楚它是什么类型的标识符。当我将其合并到模型中时,添加迁移时出现错误:Unable to determine the relationship represented by navigation property 'DeviceIdentifier.ProductIdentifier' of type 'ProductIdentifier'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

似乎迁移管理器不知道我想要的属性ProductIdentifier是什么。因此,我决定使用Fluent API来明确说明DeviceIdentifier“具有一个” ProductIdentifier(或至少使用它)。因此,我添加了行deviceIdentifier.HasOne(d => d.ProductIdentifier);。但是,当我尝试运行迁移管理器时,出现以下错误:The relationship from 'DeviceIdentifier.ProductIdentifier' to 'ProductIdentifier' is not supported because the owned entity type 'ProductIdentifier' cannot be on the principal side of a non-ownership relationship.

这是为什么?如果另一个模型是由实体/集合根拥有的,是否不可能从一个模型的属性指向另一个模型的属性?

Here you can see an image of what I am trying to accomplish。我无法创建红线!

2 个答案:

答案 0 :(得分:0)

我不了解您的问题是什么,但是在您的上下文中,覆盖OnModelCreating,然后您就可以编写实体之间的关系了。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<X>().HasOne(x => x.Y);
    modelBuilder.Entity<Z>().HasMany(x => x.X).WithOne(y=>y.Z);
}

答案 1 :(得分:0)

您是在说嵌套的拥有类型吗?

如果是,请检查文档Nested owned types。对于实体基本上相同,但是您可以使用OwnsOne来设置拥有的类型之间的关系。

HasOne用于实体,与HasMany相反。对于拥有的实体,分别为OwnsOneOwnsMany