При использовании TPH с Entity Framework, как сделать так, чтобы мои OData отображали только определенный тип?
Поскольку я поддерживаю мягкое удаление в моей базе данных, я решил ввести подтип Thing
сущность как ActiveThing
а также DeletedThing
...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// TPH (table-per-hierarchy):
modelBuilder.Entity<MyCorp.Biz.CoolApp.Thing>()
.Map<MyCorp.Biz.CoolApp.ActiveThing>(thg => thg.Requires("Discriminator").HasValue("A"))
.Map<MyCorp.Biz.CoolApp.DeletedThing>(thg => thg.Requires("Discriminator").HasValue("D"));
}
Теперь моя конечная точка OData (которая ранее подвергалась Thing
).. как мне теперь его выставить только выставить ActiveThing
s?
1 ответ
Решение
Я думаю, что я понял это..
Раньше моя модель dbContext выглядела так, только выставляя мой базовый класс:
public class myDbModel:DbContext
{
public myDbModel(): base("name=ThingDb"){}
public DbSet<Thing> Things { get; set; } //db table + ThingsController source
}
Теперь я добавил add'l DbSets для предоставления моих подтипов.. вот так:
public class myDbModel:DbContext
{
public myDbModel(): base("name=ThingDb"){}
public DbSet<Thing> Things { get; set; } //db table
public DbSet<ActiveThing> ActiveThings { get; set; } // now my ThingsController 'GetThings' pulls from this
public DbSet<DeletedThing> DeletedThings { get; set; }
}
Вот мой обновленный ThingsController.cs
public class ThingsController : ODataController
{
private myDbModel db = new myDbModel();
/// <summary>
/// Only exposes ActiveThings (not DeletedThings)
/// </summary>
/// <returns></returns>
[EnableQuery]
public IQueryable<Thing> GetThings()
{
return db.ActiveThings;
}
}