使用EF Core 2.0中的OwnsOne方法映射属性

时间:2017-09-02 19:22:11

标签: entity-framework .net-core entity-framework-core

我正在尝试将EF 6项目迁移到EF Core 2.0。 我想说明我不允许更改数据库结构中的任何内容 - 必须与EF 6项目完全相同。

我有以下实体:

abstract class Vehicle { ... }

abstract class Car : Vehicle 
{ 
    public Dimension Dimensions { get; set; } 
}

class Audi : Car { ... }

class Mazda : Car { ... }

class Dimension
{
    public double Width { get; set; }
    public double Height { get; set; }
}

表映射如下:

public VehicleMap(EntityTypeBuilder<Vehicle> entityBuilder)
{
    entityBuilder.ToTable("Vehicles");
    entityBuilder.HasKey(_ => _.Id);
    entityBuilder.HasDiscriminator<string>("Type").HasValue<Truck>(nameof(Truck));
}

public CarMap(EntityTypeBuilder<Car> entityBuilder)
{
    entityBuilder.HasDiscriminator<string>("Type")
        .HasValue<Mazda>(nameof(Mazda))
        .HasValue<Audi>(nameof(Audi));

    **entityBuilder.OwnsOne(_ => _.Dimensions);**
}

我遇到的问题是Dimensions抽象类中定义的Car属性。我想使用OwnsOne方法映射它,以便在同一个表中定义所有类属性。

我收到以下错误:

  

无法将表'车辆'用于实体类型'Car.Dimensions#Dimension'   因为它与派生实体类型'Car'有关系。或   将关系指向基础类型“车辆”或地图   'Car.Dimensions#Dimension'到另一张桌子。

知道如何在EF Core 2.0中解决它吗?

2 个答案:

答案 0 :(得分:0)

  

Allow from all称为ValueObject。此类对象的最佳做法是here

要在您的上下文中首先实现此对象,您应该在基表中定义它,因为当您使用此配置创建数据库时,您只有一个名为Dimension的表和名称为{{的discriminator列1}}。

正如错误所说:

  

将关系指向基本类型&#39; Vehicle&#39;

我们应该在基类中定义Vehicles

Type

表映射:

Dimension

答案 1 :(得分:-1)

我建议你的Car类使用基础ConfigurationBuilder。您可以制作配置类(http://www.entityframeworktutorial.net/code-first/move-configurations-to-seperate-class-in-code-first.aspx

你可以做这样的事情:

public class CarConfiguration<TBase> : IEntityTypeConfiguration<TBase>
    where TBase : class, Car
{
    public virtual void Configure(EntityTypeBuilder<TBase> builder)
    {
        builder.OwnsOne(e => e.Dimensions);
    }
}

之后你可以使用一个从CarConfiguration派生的foreC项派生的configurationClass,例如

public class AudiConfiguration : CarConfiguration<Audi>
{
    public override void Configure(EntityTypeBuilder<Audi> builder)
    {
        base.Configure(builder); //call this to use configuration from Car

        builder.....
    }
}