我正在尝试将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方法对其进行映射,以使其所有类属性都定义在同一张表中。

我收到以下错误:

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

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

最佳答案

Dimension称为ValueObject。此类对象的最佳实践是here

要在您的上下文中首先实现此对象,应在基本表中对其进行定义,因为使用这种配置创建数据库时,您只有一个表名为Vehicles,表discriminator列名为Type

如错误所示:

要么将关系指向基本类型“车辆”

我们应该在基类中定义Dimension

abstract class Vehicle
{
    public Dimension Dimensions { get; private set; }
}

表映射:
public VehicleMap(EntityTypeBuilder<Vehicle> entityBuilder)
{
    entityBuilder.ToTable("Vehicles");
    entityBuilder.HasKey(_ => _.Id);
    entityBuilder.HasDiscriminator<string>("Type").HasValue<Truck>(nameof(Truck));
    // Here
    entityBuilder.OwnsOne(p => p.Dimensions);
}

关于entity-framework - 使用EF Core 2.0中的OwnsOne方法映射属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46017372/

10-12 00:17
查看更多