2017-04-26 17 views
0

因爲我支持我的數據庫軟刪除,我選擇了分型我Thing實體ActiveThingDeletedThing ...在實體框架中使用TPH時,如何讓我的OData僅暴露特定類型?

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?

+0

偏離主題,但:我想知道,你的刪除代碼是什麼? – tschmit007

+0

如果你想看到它,我發佈我的ODataController的DELETE方法通過[here](http://stackoverflow.com/a/43639301/1520850) – bkwdesign

+0

謝謝。您使用Raw Sql,這是我懷疑的。我更喜歡一個允許完整linq到實體語法的解決方案:)。 – tschmit007

回答

0

我想我想通了..

以前,我的DbContext模型看起來像這樣,只露出我的基類:

public class myDbModel:DbContext 
{ 
    public myDbModel(): base("name=ThingDb"){} 

    public DbSet<Thing> Things { get; set; } //db table + ThingsController source 

} 

現在,我已經添加了用戶互動,增加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; 
    } 
} 
+1

可能你會考慮使用'db'作爲構造函數爭議來緩解注入和範圍控制...順便說一句:直接暴露DbSet(即使是IQueryable)可能有副作用 – tschmit007

+0

相當新的應用程序,而不是在生產中。絕對想要得到它所有的單元測試..如此,非常好的點考慮@ tschmit007。謝謝。 – bkwdesign

相關問題