0

現在、以下の単純モデルを使用しています。それはかなり簡単です:リソースがあり、RoomEmptyOffice(...)またはServiceです。Entity Frameworkコア2.0を持つ複数の子エンティティの同じプロパティ名

RoomおよびEmptyOfficeの容量は、Serviceではありません。

builder.Entity<Resource>(m => 
{ 
    m.ToTable("resource", "facility"); 
    m.HasKey(x => x.Id); 
    m.Property(x => x.Id) 
     .HasColumnName("ResourceId"); 
    m.Property(x => x.Type) 
     .HasColumnName("ResourceTypeId"); 

    m.HasDiscriminator(x => x.Type) 
     .HasValue<Room>(ResourceType.Room) 
     .HasValue<EmptyOffice>(ResourceType.EmptyOffice) 
     .HasValue<Service>(ResourceType.Service); 
}); 

builder.Entity<Room>(); 
builder.Entity<EmptyOffice>(); 
builder.Entity<Service>(); 

私は私のコードを実行し、EFコアは、次の例外がスローされます:

public abstract class Resource : Entity 
{ 
    public string Name { get; set; } 
} 

public class Room : Resource 
{ 
    public int Capacity { get; set; } 
} 

public class EmptyOffice : Resource 
{ 
    public int Capacity { get; set; } 
} 

public class Service : Resource 
{ } 

は私のSQLビューからデータを取得するには、私はマッピングを使用

System.Data .SqlClient.SqlException: '無効な列名' Room_Capacity '。'

Capacityプロパティの名前をRoom_Capacityに変更しても機能しますが、恐ろしいことです。

どのようにしてEF Core 2.0が自分の子エンティティのそれぞれの容量プロパティを対象にすることができますか?

はあなたがEFコアで利用可能な唯一の継承パターンとしてクラス階層ごとのテーブルであることを行うことができないあなたに セバスチャン

+0

EFコア2.0の移行を使用してデータベースを作成しましたか? – Smit

+0

Nope。私は既存のDBを使用しています。 – Seb

+0

データベース内のテーブル構造の詳細を共有できますか?ここでの問題は、EFが既存のデータベースと一致しない特定のデータベース構造を作成することです。データベースモデルを共有すると、不足している部分が見つかります。 – Smit

答えて

0

ありがとうございます。基本クラスの代わりにインタフェースを使用することができますが、各エンティティは別のテーブルにマップされます。 [NotMapped]で除外するプロパティをマークするか、コードを使用してIgnoreを指定します。

+0

実際には、Room/EmptyOfficeの容量プロパティを容量表示に戻したいと思っています。上記のコードでそれをしようとすると、私はRoom_capacityについての例外を取得します。私の推測では、Entity Frameworkは、Room.CapacityとEmptyOffice.Capacityを区別するために、エンティティタイプ+プロパティ名を連結します。なぜそれが必要なのか分かりません... – Seb

+0

EFコアで利用できる唯一の継承パターンは、クラスごとのテーブル階層です。基本クラスの代わりにインタフェースを使用することができますが、各エンティティは別のテーブルにマップされます。私の悪い、申し訳ありません! –

+0

私はバッキングフィールドを使用して、NonMappedとして容量プロパティをマークする必要があるので参照してください。はい、意味があります;) – Seb

関連する問題