我正在尝试将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中解决它吗?
答案 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.....
}
}