2017-04-26 7 views
2

私は次のエンティティを持っている:EFコア「無効な列名 『弁別』」の継承とエラー

public abstract class Freezer 
{ 
    public int FreezerId { get; set; } 
    public string Name { get; set; } 
    public int FreezerTypeId { get; set; } 
    public int Capacity { get; set; } 
} 

public class FoodFreezer : Freezer 
{ 
    public List<FoodItem> Foods { get; set; } 
} 

public class ChemicalFreezer : Freezer 
{ 
    public List<ChemicalItem> Chemicals { get; set; } 
} 

あなたが派生Freezerクラスはデータベースに格納されるすべてのデータが含まれていません見ることができるように。特定のコンテンツタイプのナビゲーションプロパティのみを含んでいます。

私は、次の構成を持っている:

internal class FreezerConfiguration<T> : DbEntityConfiguration<T> where T : Freezer 
{ 
    public override void Configure(EntityTypeBuilder<T> builder) 
    { 
     builder.ToTable("Freezers"); 
     builder.HasKey(x => x.FreezerId); 

     builder.Property(x => x.FreezerId).IsRequired(); 
     builder.Property(x => x.Name).IsRequired(); 
     builder.Property(x => x.FreezerTypeId).IsRequired(); 
     builder.Property(x => x.Capacity).IsRequired(); 
    } 
} 

internal class FoodFreezerConfiguration : FreezerConfiguration<FoodFreezer> 
{ 
    public override void Configure(EntityTypeBuilder<FoodFreezer> builder) 
    { 
     builder.HasMany(x => x.FoodItems).WithOne(x => x.Freezer); 
    } 
} 

私は私のコンテキストからFoodFreezerのリストを取得するための呼び出しを行うとき、私は「無効な列名 『弁別』」エラーが発生します。いくつかの研究をした後、それはFoodFreezerChemicalFreezerが単一のテーブルを指しているということを好まないようです。私は何を変更する必要がありますか? FreezersテーブルのFKであるFreezerId列のみのFoodFreezersおよびChemicalFreezersデータベーステーブルが必要ですか?

+2

あなたは階層ごとのテーブル(TPH)構造を実現したいようですが、あなたのマッピングに 'HasDiscriminator()'メソッドを使用していないようです。 https://docs.microsoft.com/en-us/ef/core/modeling/relational/inheritanceを参照してください。 – haim770

答えて

3

@ haim770は私に正しい道を導いた。私は私のFreezerConfigurationに以下を追加する必要がありました:

builder.HasDiscriminator(x => x.FreezerTypeId) 
    .HasValue<FoodFreezer>(FreezerTypeEnum.Food) 
    .HasValue<ChemicalFreezer>(FreezerTypeEnum.Chemical); 

追加のテーブルやコードは必要ありません。 ChemicalFreezerのIDを使用してFoodFreezerを取得しようとすると、nullが返されます。すごくかっこいい。

関連する問題