7

DbSet<T>同じ基本クラスから派生するすべてのタイプで異なるを設定したDbContextがあります。

public class Foo : Entity { }
public class Bar : Entity { }

MyDbContext : DbContext
{
  public DbSet<Foo> Foos { get; set; }
  public DbSet<Bar> Bars { get; set; }
}

Entity次のように、1つのクエリで基本クラスを持つすべてのエンティティを取得することは可能ですか?

DbContext.Set<Entity>();  // doesn't work

DbSet<Entity>DbContextに明示的なものを導入しようとしましたが、データベース内のすべてのエンティティに対して1つの大きなテーブルが作成されます。

追加の質問:これが何らかの形で機能する場合、インターフェイスのクエリはどうですか?

編集:

Ladislav Mrnkaのリンクの指示に従い、次のようにマッピングを行いました。

MyDbContext : DbContext
{
  public DbSet<Entity> Entities { get; set; }

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    // Foo
    modelBuilder.Entity<Foo>().Map(x =>
    {
      x.MapInheritedProperties();
      x.ToTable("Foo");
    })
    .HasMany(x => x.Tags).WithMany();

    modelBuilder.Entity<Foo>()
        .Property(x => x.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

    // Bar
    // same thing for Bar and a bunch of other Entities

    base.OnModelCreating(modelBuilder);
  }
}

これでエラーが発生します

プロパティ「Id」は、タイプ「Foo」で宣言されたプロパティではありません。IgnoreメソッドまたはNotMappedAttributeデータアノテーションを使用して、プロパティがモデルから明示的に除外されていないことを確認します。それが有効なプリミティブプロパティであることを確認してください。

また、キーをIdプロパティに明示的に設定しようとしました。

modelBuilder.Entity<Foo>().Map(x => {...})
  .HasKey(x => x.Id)
  .HasMany(x => x.Tags).WithMany();

私は何が欠けていますか?

4

2 に答える 2

4

TPC 継承を導入する必要があります。その後DbContext.Set<Entity>()は機能し、エンティティごとにテーブルが残ります。

于 2011-04-28T13:23:21.513 に答える
2

あなたの編集セクションの問題にちょうど:

エラー メッセージはId、基本クラスに key プロパティがあることを示していますEntityFoo次に、派生クラスではなく、このクラスでキー プロパティを構成する必要があります。

modelBuilder.Entity<Entity>()
    .Property(x => x.Id)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
于 2011-04-28T19:26:51.420 に答える