2012-03-06 3 views
1

Entity Frameworkのコードファースト(そうなし.edmx) は私が行うにはブール値でIsEnabledと基本エンティティクラスを持っているので、私が使用しているソフトの削除Entity Frameworkのコードファーストソフト

私が使用していますリポジトリパターンレイジーロードを削除します。リポジトリに対するすべてのクエリをIsEnabledでフィルタリングすることができます。

ただし、リポジトリを使用してIsEnabledというMyTypeを取得すると、Lazy Loading MyType.Itemsはアイテムを有効にできない可能性があります。

EF Fluentでテーブルをフィルタリングする方法を説明する方法はありますか?

更新:

私はDbset

public class UnitOfWork : DbContext 
    { 
private IDbSet<MyObj> _MyObj; 
public IDbSet<MyObj> MyObjs 
     { 
      get { return _MyObj ?? (_MyObj = base.Set<MyObj>()); } 
     } 
} 

を持っている場合、私はDbSetをフィルタリングするDbContextを伝えることができます任意の方法はありますか?

+0

また、更新の後でも答えはいいです:もちろん、あなたは 'IQueryable MyFilteredObjs {get MyObjs.Where(m => m.IsEnabled);}のようなコンテキストクラスにプロパティを追加できます。 }} '。しかし、私はそれがあなたが望むものではないと思って、それは怠惰な、または熱心な読み込みには適用されません。 – Slauma

答えて

4

いいえ、遅延ロード用のフィルタを定義する方法はありません(また、Includeを使用して熱心な読み込み用ではありません)。

context.Entry(parent).Collection(p => p.Items).Query() 
    .Where(i => i.IsEnabled) 
    .Load(); 

これが唯一の有効なアイテムとparentItemsコレクションに移入されます:あなたは、あなたのナビゲーションコレクションのみIsEnabledはあなたが唯一の明示的なロードと例えば、それに応じてクエリを形作ることができtrueあるアイテムに読み込まれますことをしたい場合。

編集は、私は彼の頭を取得し、失われた戦いに関する悪いニュースのメッセンジャーのようなビットがオフにノックを感じます。 Entity Frameworkに必要な機能がないと信じるのは難しいかもしれません。あなたを説得するために私のチャンスを向上させるために、私はquote from an authority, Julie Lerman追加:エンティティ Frameworkで

積極的なロードどちらも延期/遅延読み込みを使用すると、フィルタリングしたり が返される関連データをソートすることができます。

+0

EFチームにそれを推薦する方法があったと思うのは残念です。 – maxfridbe

+1

@maxfridbe:実際に機能リクエストを提案することができます:http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions 'Include'(熱心な読み込み)(リクエストリストに8を置く)でフィルタリングすることができますが、このような遅延読み込み要求は見られませんでした。 – Slauma

+0

こんにちは、私は遅くここにいて、与えられた解決策はきれいです。このようなものに何が問題なの? var parent.items = context.Items.Where(x => x.parent_id == parent.parentID && x.IsEnabled == true).ToList();だから、私はparentIDを使用しているし、私は必要な項目を設定しています。 –

0

このhttp://blogs.claritycon.com/blog/2012/01/25/a-smarter-infrastructure-automatically-filtering-an-ef-4-1-dbset/は、基本的にどのように私が探していたものを達成できるかを定義します。

基本的にFilteredDbSetを作成し、すべてのDbContext IDbSetがそれを返すようにします。

+1

これはあなた自身の質問に対する答えではありません。このFilteredDbSetは遅延読み込みには影響しませんが、親エンティティのクエリに対してのみ有効です。遅延読み込み中のアイテムにフィルタを適用する方法を尋ねました。 *この*質問に関しては、私の答え(私が今編集したもの)はまだ有効であると考えます。 – Slauma

+0

FilteredDbSet get私の半分です。私はこれを言うことが嫌いだが、私は[NotMapped] ActiveMyObjs {return MyObjs.Where ...などの私のdmainにも束縛されたコレクションを追加しました。 使用を強制する方法はありませんが、動作します。 – maxfridbe

1

まだ可能です。あなたがintrestedの場合、Wiktor Zychla blogpostを見ることができます。ここで彼はソフト削除問題の解決策を教えてくれます。