2017-09-02 501 views
3

我正在尝试将EF 6项目迁移到EF Core 2.0。 我想强调我不允许在数据库结构中更改任何内容 - 必须与EF 6项目完全相同。在EF Core 2.0中使用OwnsOne方法映射属性

我有foloowing实体:

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);** 
} 

我的问题是,在Car抽象类定义约Dimensions财产。我想使用OwnsOne方法将其映射到同一个表中定义的所有类属性。

,我发现了以下错误:

Cannot use table 'Vehicles' for entity type 'Car.Dimensions#Dimension' since it has a relationship to a derived entity type 'Car'. Either point the relationship to the base type 'Vehicle' or map 'Car.Dimensions#Dimension' to a different table.

不知道如何解决它在EF核心2.0吗?

+0

我有同样的问题...好像实体框架的核心2.0不支持这一点。 –

回答

-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的foreach项派生的configurationClass

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

     builder..... 
    } 
} 
0

The Dimension known as ValueObject . The best practice for this type of objects is here .

为了实现这个对象在上下文首先应该在基表定义它,当你创建数据库,此配置必须与Vehicles名称和辨别字段的名字只是一个表,因为的Type

由于错误说:

Either point the relationship to the base type 'Vehicle'

我们应该在基类中定义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); 
}