У меня есть 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();
Что мне не хватает?