2017-04-05 5 views
0

MyDbContext.UsersやMyDbContext.Studentsなどを呼び出すときなど、私たちのDbContextでDbContextによって実行されるSELECTクエリに対して、新しい機能を追加する必要があります(UserとStudentはBaseEntityクラスから継承します。本物のIsActiveが含まれている場合)、それらを傍受し、この基本型のBaseEntityであるかどうかをチェックし、何らかの方法でクエリを変更できます。たとえば、IsActiveがtrueであるかどうかを確認するwhere句を追加します。私はIDbCommandInterceptorインターフェイスを調べようとしましたが、おそらく私に関係するものを含めて、ReaderExecutingなど、MyDbContextのdbsetsだけでなく、データベース上で実行されるすべての種類のSELECTステートメントをインターセプトします。
これをどのようにして正しく行うことができますか?Entity Framework 6.3でインターセプトメカニズムを使用する方法は?

おかげで、ashilon

答えて

1

インターセプタは、この例では、あなたが望むものはおそらくありません。これらはすべてのDbContextのすべてのクエリを代行受信し、SQLを直接変更することしかできません。これは、ジョインがすべてを混乱させる可能性があるので、where句を追加したいときには危険です。

リポジトリまたは基本クラスを使用している場合は、すべてのクエリが実行されます。あなたはいつも文脈をしています。勉強しています。どこで(...)あなたができることができますが、それがうまくいくかどうかは完全にはわかりませんが、なぜそうでないのか分かりません。

あなたのDbContextクラスでは、StudentsのようなすべてのDbSetプロパティnamesdをStudentsDbSetに変更します。私はそれを置き換えるためにこのプロパティを追加します:

public IQueryable<Student> Students 
{ 
    get { return StudentdsDbSet.Where(a => a.IsActive); } 
} 

すべての古いコードは、IsActiveだけのレコードを強制するこのプロパティを参照するようになりました。次に、非アクティブな生徒が必要な場合は、StudentsDbSet.Where(...)を実行して、あなたはうまくいくでしょう。

+0

優秀な回答Daniel!素晴らしい説明と素晴らしい回避策。小さな質問:DbSetの代わりにIQueryableを返す理由はありますか? StudentsDbSetもIQueryableである必要がありますか?どうもありがとう。 – ashilon

+1

Where節を実行すると、これはIQueryableになります。これはもはやDbSetを返しません。 ContextにはDbSetプロパティが必要です。これは、エンティティフレームワークがマッピングをフックアップする方法を知っているからです、と私は信じています。 –

関連する問題