2017-09-02 22 views
3

EF 6プロジェクトをEFコア2.0に移行しようとしています。 私は、データベース構造内で何かを変更することは許されていないことを強調したいと思います - EF 6プロジェクトとまったく同じでなければなりません。EFコア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

私は同じ問題を抱えています... Entity Frameworkのコア2.0がこれをサポートしていないように思えます。 –

答えて

-1

あなたのCarクラス用の基本ConfigurationBuilderをお勧めします。あなたは、例えば、車から派生CarConfiguration foreachの項目から派生configurationClassを使用することができます。その後

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

:あなたはこのような何かを行うことができるよりも、コンフィギュレーションクラス(http://www.entityframeworktutorial.net/code-first/move-configurations-to-seperate-class-in-code-first.aspx

作ることができるより

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); 
} 
関連する問題