2011-01-07 8 views
3

"where"フィルタを常に適用するエンティティフレームワークで関連付けを作成する方法はありますか?フィルタとの関連付けを定義しますか?

ここに例があります: 「ソフト」削除を使用するデータベースがあると仮定すると、すべてのテーブルに「削除済み」列があります。

Address(1:0..n)に関連するCustomerエンティティがある場合、Addressesナビゲーションプロパティを常に削除済みフラグにフィルタリングして、Customer.Addressesコレクションは削除されたアドレス== 0のみを返します。

誰かがこれを行う方法を知っていますか?

答えて

3

いいえ、ありません。

同じ理由で、条件付き外部キーを使用できません。

回避策は住所テーブルの上にTPHを使用することができます

  • は抽象エンティティが
  • 作成派生エンティティは呼ばアドレスと呼ば作成 AddressDeletedと
  • セットをAddressNotDeleted識別子マッピング(AddressDeletedは、Deleted = 0のときのアドレスにマップする)
  • CustomerとAddressDeletedの間にナビゲーションプロパティを作成します。

したがって、ctx.Customer.Include("AddressDeleted").Single()を実行すると、削除済みのフラグが設定されているアドレスのみが返されます。

または、アドレスとの関連付けを定義してctx.Customer.Addresses.OfType<AddressDeleted>()を使用できます。

これで問題が解決しますか?

+0

解決策かもしれません - 私はもう少し遊ぶ必要があります - 私はEFにとってかなり新しいです。私がT4テンプレートを変更した場合、または私自身のPOCOを生成してEFで使用した場合、必要な方法で協会を働かせる方法があるかどうかは知っていますか(どちらもこれらの機能はまだありません) – JMarsch

+0

覚えておく必要があるのは、ナビゲーションプロパティは「概念上の外部キー」のようなものです。データベース内のFKと同じようにレコードを一意に識別するために使用されます。ナビゲーションプロパティは、データベース内のFKまたはカスタム参照制約にマップする必要があります。しかし、そのカスタム制約でも、関係の両側に1-1のマップが必要です。条件付きにすることはできません。 TPHは非常に簡単です - このブログ/ウォークスルーを読んでくださいhttp://blogs.microsoft.co.il/blogs/gilf/archive/2010/01/24/table-per-hierarchy-inheritance-in-entity -framework.aspx – RPM1984