2017-05-26 15 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 {} 
    } 
} 

これは罰金コンパイルが、私はそれを実行するとベースがnullとデバッグ利回りで「エラーCS0175:キーワードの使用 『base』はこのコンテキストでは有効ではありません」

これを達成するにはどうすればよいですか?あるいは、別の解決策を探す必要がありますか?ありがとう!そうような継承上に組成物を使用することがおそらく最も

+0

'DbSet 'は' IQueryable 'ですが、その逆もありません。だから 'base.Records.Where(...)'は 'DbSet 'ではなく、 'IQueryable 'です。つまり、あなたがしようとしていることは不可能です。 –

答えて

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(...); } 
    } 
} 

を実装し、また、両方のインターフェースが存在すべきです、あなたは具体的なクラスに直接依存しません。

関連する問題