具有使用实体框架核心的集合关系的拥有实体

时间:2019-02-12 09:43:00

标签: entity-framework-core

我正在尝试使用表拆分为以下类结构建模,其中PersonDetails是拥有实体,即,数据库模式中没有名为PersonDetails的表

我正在使用实体框架核心2.2

public class Person
{
  public long Id { get; set; }
  public PersonDetails Details { get; set; }
}

public class PersonDetails
{
  public IReadOnlyCollection<Address> Addresses { get; set; }
  public IReadOnlyCollection<Contact> Contacts { get; set; }
}

public class Address
{
  public string Street { get; set; }
  public string Suburb { get; set; }
}

public class Contact
{
  public string PhoneNumber { get; set; }
  public string EmailAddress { get; set; }
}

实体类型映射如下:

public class PersonTypeConfiguration : IEntityTypeConfiguration<Person>
{
  public void Configure(EntityTypeBuilder<Person> builder)
  {
    builder.Property(p => p.Id).ValueGeneratedOnAdd();
    builder.OwnsOne(p => p.Details, b =>
    {
      b.HasMany(p => p.Addresses).WithOne().OnDelete(DeleteBehavior.Cascade);
      b.HasMany(p => p.Contacts).WithOne().OnDelete(DeleteBehavior.Cascade);
    });
  }
}

public class AddressTypeConfiguration : IEntityTypeConfiguration<Address>
{
  public void Configure(EntityTypeBuilder<Address> builder)
  {
    builder.Property<string>("Id").ValueGeneratedOnAdd();
  }
}

public class ContactTypeConfiguration : IEntityTypeConfiguration<Contact>
{
  public void Configure(EntityTypeBuilder<Contact> builder)
  {
    builder.Property<int>("Id").ValueGeneratedOnAdd();
  }
}

此配置会引发以下错误:

“不支持从“地址”到“ PersonDetails.Addresses”的关系,因为拥有实体类型“ PersonDetails”不能位于非所有权关系的主体上。

EF核心支持此映射吗?我无法在文档中找到它,但也许我错过了。

如果不支持,是否有人计划支持它?

完整示例见https://github.com/RossJayJones/entity-framework-core-samples

1 个答案:

答案 0 :(得分:0)

这是设计不支持的。拥有的类型是聚合的一部分,并且只能从外部引用聚合根。

您仍然可以使用相同的类并使用表拆分,只是不要将PersonDetails配置为拥有的。