Entity Framework 4.1 Code First: получить все сущности с определенным базовым классом - PullRequest
7 голосов
/ 28 апреля 2011

У меня есть DbContext с настройкой различных DbSet<T> s со всеми типами, которые происходят от одного и того же базового класса:

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

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

Возможно ли получить все сущности, имеющие базовый класс Entity, в одном запросе, например:

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

Я попытался ввести явное DbSet<Entity> в DbContext, но это привело к одной большой таблице для всех сущностей в базе данных.

Дополнительный вопрос: если это работает как-то, как насчет запросов к интерфейсам?

Edit:

Я следовал инструкциям по ссылке Ладислава Мрнки и сделал мои отображения следующим образом:

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();

Что мне не хватает?

Ответы [ 2 ]

4 голосов
/ 28 апреля 2011

Вам необходимо ввести наследование TPC .После этого DbContext.Set<Entity>() будет работать, и у вас все еще будет таблица на сущность.

2 голосов
/ 28 апреля 2011

Просто к вашей проблеме в разделе редактирования:

Сообщение об ошибке указывает на то, что в базовом классе Entity имеется свойство ключа Id. Затем необходимо настроить свойство ключа для этого класса, а не для производного класса Foo:

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