db.Usersとやり取りするときに常に特定の拡張を呼び出す必要がある方法。以下は、より具体的な情報です。DbSetを使用するときに特定の拡張メソッドが常に呼び出されるようにするEntity Frameworkユニットテスト(または同様の方法)
Entity Frameworkを介して、自分のデータベースと対話するとき、私は次のクエリ(DBはDbContextインスタンスである)を持つ:句が頻繁になりますWHEREこのクエリ
var user = db.Users
.FromOrganisation(someId)
.FirstOrDefault(u => u.Username == someUsername);
は、(アプリケーション全体の時間のすべてを変えるだろう異なるものなど)。このため、返されるすべてのデータが最初に組織によってフィルタリングされるように、FromOrganisation()拡張メソッドを常に呼び出さなければならないという要件を作りたいと考えています。
これは、他の組織に属しているデータを見たことがないユーザーを防ぐためですが、これを達成する方法を厳密に守っています。
組織単位でフィルタリングせずにユーザーDbSetが使用されていることを開発者に警告するために書くことができる単体テストはありますか?そうでない場合、同じレベルの保護を達成するために私が取ることのできる代替ルートがありますか?
ことが重要だ場合は、拡張メソッド自体は次のようになります。次のように私は私のコンテキストを変更
public static IQueryable<User> FromOrganisation(this IQueryable<User> u, int organisationId)
{
return u.Where(x => x.OrganisationId == organisationId);
}
私の最終的な解決策
:
public DbSet<User> Users { get; set; }
になった:
[Obsolete("MUST use service!")]
public DbSet<User> UsersUnfiltered { get; set; }
public IQueryable<User> Users(int id)
{
#pragma warning disable 618
return UsersUnfiltered.Where(x => x.OrganisationId == id);
#pragma warning restore 618
}
これは、Usersメソッドを使用して組織ごとにフィルタリングされたユーザーリストを返すことを推奨します。これは、通常どおりフィルタ、結合、照会などを行うことができます。
必要に応じてUsersUnfiltered DbSetにアクセスできますが、これを使用するとコンパイラの警告が生成されます。この警告は、#pragma warning disable 618ディレクティブの内部でアクセスすることで抑制できます。
これを実行すると、あなたが本当に意思表示しない限り、あなたが組織でフィルタリングせずにユーザーデータを使用することを防ぐためのコードがあなた側にあります。
@mark_hのおかげでこのソリューションに到達できました。
あなたは 'Users'セットを公開する必要がありますか?あなたが 'IQueryable GetOrganisationUsers(int id)'を介してのみユーザをフェッチするとどうなりますか? –
Default
これは非常に興味深い点です。私の文脈では、現在DbSetのリストが公開されています。しかし、私はこれらを問合せに使うだけでなく、データベースに新しいレコードを追加するためにも使用します。そのため、行のどこかに公開しなければならないと思います。 –
コンテキストに 'AddUser'メソッドを追加することができます。別のオプションは、EntityFramework.DynamicFiltersでグローバルフィルタを定義することです。 –