2017-05-26 36 views
0

我正在從一個EDMX文件生成一個具有DbContext類的項目。我需要在某些情況下根據身份驗證狀態過濾一些記錄,而不是在從DbContext類接收到記錄後重寫代碼以過濾記錄我首先認爲創建另一個繼承自原始DbContext的類會很簡單然後重寫getter和setter,然後使用新類。事情是這樣的:DbContext在訪問基本屬性時重寫DbSet屬性獲取器

public partial class AutogeneratedBaseClass : DbContext 
{ 
    ... 
    public virtual DbSet<Record> Records { get; set; } 
    ... 
} 

public class ChildClass : AutogeneratedBaseClass 
{ 
    ... 
    public override DbSet<Record> Records 
    { 
     get { 
      return (DbSet<Record>) base.Records.Where(...); 
     } 
     set {} 
    } 
} 

編譯沒有問題,但是當我運行它的基礎是零和調試收益率「錯誤CS0175:使用關鍵字‘基地’的無效在這種情況下」

有沒有辦法做到這一點?或者我需要尋找另一種解決方案?謝謝!

+0

'DbSet '是'IQueryable ',但反之亦然。因此'base.Records.Where(...)'是一個常規的'IQueryable '而不是'DbSet '。換句話說,你所嘗試的是不可能的。 –

回答

0

也許最好使用成分過繼承,像這樣:

落實的DbContext

public class MainDbContext : DbContext 
{ 
    public DbSet<Record> Records { get;set; } 
} 

然後實現濾波的版本

public class FilteredDbContext 
{ 
    private readonly MainDbContext dbContext; 

    public FilteredDbContext(MainDbContext dbContext) 
    { 
     this.dbContext = dbContext; 
    } 

    public IQueryable<Record> Records 
    { 
     get { return dbContext.Records.Where(...); } 
    } 
} 

理想的情況下,也應該有兩個接口,所以你不要直接依賴具體的課程。