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

C# 为什么在指向所拥有的实体类型时不能使用HasOne()?,c#,entity-framework-core,domain-driven-design,C#,Entity Framework Core,Domain Driven Design,我有一个聚合根(产品),其中包括一个值对象列表(产品标识符)。为了将这个值对象列表存储在一个单独的数据库表中,我使用了EF Core 2.2的OwnsMany()方法。不同的AR(设备)还具有值对象(设备标识符)列表。对于DeviceIdentifier的模型,我想指出ProductIdentifier,以明确它是什么类型的标识符。当我刚刚将其合并到模型中时,在添加迁移时出现错误:无法确定由类型为“ProductIdentifier”的导航属性“DeviceIdentifier.ProductI

我有一个聚合根(产品),其中包括一个值对象列表(产品标识符)。为了将这个值对象列表存储在一个单独的数据库表中,我使用了EF Core 2.2的
OwnsMany()
方法。不同的AR(设备)还具有值对象(设备标识符)列表。对于DeviceIdentifier的模型,我想指出ProductIdentifier,以明确它是什么类型的标识符。当我刚刚将其合并到模型中时,在添加迁移时出现错误:
无法确定由类型为“ProductIdentifier”的导航属性“DeviceIdentifier.ProductIdentifier”表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.ignore”忽略此属性。

迁移管理器似乎不知道我想要属性
ProductIdentifier
做什么。因此,我决定使用Fluent API来明确说明
DeviceIdentifier
“有一个”ProductIdentifier(或者至少使用它)。因此,我添加了行
deviceIdentifier.HasOne(d=>d.ProductIdentifier)。但是,当我尝试运行迁移管理器时,出现以下错误:
不支持从“DeviceIdentifier.ProductIdentifier”到“ProductIdentifier”的关系,因为拥有的实体类型“ProductIdentifier”不能位于非所有权关系的主体侧。

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


。我无法创建红线

我不理解您的问题是什么,但是在您的上下文中,重写modelCreating上的
,您可以对实体之间的关系进行编码

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<X>().HasOne(x => x.Y);
    modelBuilder.Entity<Z>().HasMany(x => x.X).WithOne(y=>y.Z);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity().HasOne(x=>x.Y);
modelBuilder.Entity()有许多(x=>x.x)。其中一个(y=>y.Z);
}

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

如果是,请检查文档。基本上,实体也是如此,但您可以使用
OwnsOne
来设置所属类型之间的关系


HasOne
表示实体,与
HasMany
相反。对于拥有的实体,它是
OwnsOne
OwnsMany

我不能这样做,因为在指向值对象(即DDD术语)时不能使用HasMany()。值对象没有ID,因此在数据库表中存储值对象数组时,它们需要具有复合键(请参见此链接:)。因此,我必须使用OwnsMany(),这导致了当前的问题……hello@ydg。我也有同样的问题。你找到解决办法了吗?