我正在尝试将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/