【问题标题】:When using TPH with Entity Framework, how do I make my OData only expose a particular type?将 TPH 与 Entity Framework 一起使用时,如何使我的 OData 仅公开特定类型?
【发布时间】:2017-09-24 02:11:20
【问题描述】:

因为我在我的数据库中支持软删除,所以我选择将我的Thing 实体子类型为ActiveThingDeletedThing...

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).. 我如何让它现在只暴露 ActiveThings?

【问题讨论】:

  • 离题但是:我想知道,你的删除代码是什么?
  • 如果你想看的话,我在here 上发布了我的 ODataController 的 DELETE 方法
  • 谢谢。您使用的是 Raw Sql,这就是我的怀疑。我更喜欢允许完整 linq 到实体语法的解决方案:)。

标签: entity-framework asp.net-web-api2 odata tph


【解决方案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;
    }
}

【讨论】:

  • 您可能会考虑使用 db 作为构造函数参数来简化注入和范围控制...顺便说一句:直接公开 DbSet(即使作为 IQueryable)可能会产生副作用跨度>
  • 相当新的应用程序,尚未投入生产。绝对想把它全部单元测试化..所以,考虑@tschmit007非常好。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-03-28
  • 2011-05-04
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多