我首先使用EF Core 2.2代码来描述域模型,遵循DDD原则。 我在标量和集合设置中使用(成功地)使用拥有的实体类型来实现值对象的概念。
我需要使用嵌套的拥有的类型,其中上层是标量拥有的实体(值对象),内部是拥有的实体的集合。
所有者实体(聚合根):
public class Delivery : BaseEntity, IAggregateRoot
{
public DeliveryService DeliveryService { get; set; }
}
顶级拥有实体类型(值对象)
public class DeliveryService : ValueObject
{
public ICollection<DeliveryServicePricing> Pricings { get; set; }
}
嵌套的拥有实体类型(值对象的集合)
public class DeliveryServicePricing : ValueObject
{
public decimal SellingPrice { get; set; }
public ICollection<DeliveryServiceUnitCost> UnitCosts { get; set;
}
所有者实体类型配置
public class DeliveryConfiguration : IEntityTypeConfiguration<Delivery>
{
public void Configure(EntityTypeBuilder<Delivery> builder)
{
builder.OwnsOne(d => d.DeliveryService, ob =>
{
ob.ToTable("DeliveryServices");
ob.OwnsMany(ds => ds.Pricings, ob1 =>
{
ob1.ToTable("Pricings");
ob1.HasForeignKey("DeliveryServiceId");
// shadow property useful to compose a key
ob1.Property<decimal>("SellingPrice");
ob1.HasKey("DeliveryServiceId", "SellingPrice");
});
});
}
}
运行此代码以插入新实体时,保存更改后出现此错误:
消息:System.AggregateException:发生一个或多个错误。 (不支持从“ DeliveryServiceUnitCost”到“ DeliveryServicePricing.DeliveryServiceUnitCosts”的关系,因为拥有实体类型“ DeliveryServicePricing”不能位于非所有权关系的主体上。)(以下构造函数参数没有匹配的夹具数据: DbContextQueriesFixture固定装置) ---- System.InvalidOperationException:不支持从“ DeliveryServiceUnitCost”到“ DeliveryServicePricing.DeliveryServiceUnitCosts”的关系,因为拥有实体类型“ DeliveryServicePricing”不能位于非所有权关系的主体上。 ----以下构造函数参数没有匹配的夹具数据:DbContextQueriesFixture夹具
Microsoft官方文档对嵌套类型必须在从属方面而不是主体这一事实进行了说明:
除了嵌套的拥有的类型外,拥有的类型还可以引用常规实体,只要拥有实体在从属端,它就可以是所有者或其他实体。此功能可将拥有的实体类型与EF6中的复杂类型区分开。
...但是他们谈论的是相关实体(HasOne / Many),而不是拥有的实体(OwnsOne / Many)。
因此,我不再确定OwnsOne / OwnMany嵌套组合实际上是可行的。 对此有任何确认吗?