У меня есть DbContext с настройкой разных DbSet<T>
со всеми типами, производными от одного и того же базового класса:
public class Foo : Entity { }
public class Bar : Entity { }
MyDbContext : DbContext
{
public DbSet<Foo> Foos { get; set; }
public DbSet<Bar> Bars { get; set; }
}
Можно ли получить все сущности, имеющие класс Entity
base, в одном запросе, например:
DbContext.Set<Entity>(); // doesn't work
Я попытался ввести явное DbSet<Entity>
в DbContext, но это привело к созданию одной большой таблицы для всех сущностей в базе данных.
Дополнительный вопрос: если это как-то работает, как насчет запроса интерфейсов?
Изменить:
Я следовал инструкциям на link и сделал мои сопоставления следующим образом:
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();
Что мне не хватает?