2017-07-07 5 views
0

私はエンティティフレームワークを使用してSQLビューを取得しています。このビューは、結合された2つの既存のオブジェクトを表します。私は、これを行う最善の方法はオブジェクトが他のオブジェクトを継承することになると考えました。EFで継承したクラスを持つエンティティにDBテーブルからデータを取り込む方法は?

私はこのエラーを取得しています:ここで

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Class1>() 
    .ToTable("mySQLView", "TEST") 
    .HasKey(r => new { r.Property1 }); 

    modelBuilder.Entity<Class1>().Property(r => r.Property1).HasColumnName("Key1"); 
    modelBuilder.Entity<Class1>().Property(r => r.Property2).HasColumnName("Column2"); 

    modelBuilder.Entity<Class1>().Property(r => r.Property3).HasColumnName("Column3"); 
    modelBuilder.Entity<Class1>().Property(r => r.Property4).HasColumnName("Column4"); 
} 

は私の二つのクラスです:

public class Class1 : Class2 
{ 
    public string Property1 { get; set; } 
    public string Property2 { get; set; } 
} 

public class Class2 
{ 
    public string Property3 { get; set; } 
    public string Property4 { get; set; } 
} 

クラス2は、によって利用されている。ここ

System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Invalid column name 'Discriminator'.

は、私がセットアップ持っているものです別のDB呼び出し。 Class1は、これらの呼び出しの1つでのみ使用されています。私のクラスを構成する方法やEFを正しく設定する方法についての助けがあれば、大歓迎です!

答えて

1

問題は、EFが継承を実装するために使用するTPH(Table Per Hieararchy)を使用していることです。 TPHの使用EFには、レコードを階層の特定のエンティティに関連付けるためのdiscriminatorという名前の列が必要です。

私はあなたがTPTを必要とすると思いますが(しかし、あなたがクラスへのアクセスを望むかどうかによって異なります)これを行うには、ToTableを使用してClass2テーブル(またはビュー)の名前を設定します。それ以外の場合は、Discriminator列を追加できますが、EFを処理しておく必要があります。

+0

これらの方法は有用であり、私は解決策に近づけました。私のチームと話をした後、私たちはプロパティを複製することにしました。それらの構造と命名規則はまったく同じですが、2つのビューは別々のデータベースにある2つの別々のデータセットです。 –

関連する問題