0

私は1対多の本などとの2クラスがあります。EF(リポジトリパターン)を使用して.NET MVC3でデータアクセスルールを繰り返さない方法

public class Parent 
{ 
    public virtual List<Child> Children {get; set;} 
} 

を私はまた、すなわち、各モデルのリポジトリクラスを使用して ています:

親が(GETを持っているそれ自身のレポクラスを持っています)関数で、親の順序付きリストを取得できます。

子はまた、Activeのステータスを持つ子の順序付きリストを取得できるGet()関数自体のレポクラスを持っています。

問題は、親が子への参照を持つため、EFは親リストがロードされたときに子を自動的にロードしますが、アクティブな子と非アクティブな子を取得します(子リストも順序付けされません)。アクティブステータスのチェックは、子レポのみにあります。

どのように子供がアクセスされるかにかかわらず、「取得」ルールの繰り返しを制限することができます。

...

編集私はちょうどアクティブ=も子供の状態をチェックするために親のレポを変更することができます知っているが、その後、私は子供を持っているすべてのクラスで私のロジックを繰り返しています:私はリポジトリクラスを持っている を子供の順序付きリストを返す子の場合:

public List<Children> GetList() 
    { 
     IQueryable<Children> query = context.Set<Children>(); 

     return query.OrderBy(a=>a.Seq).ToList(); 
    } 

子どもに直接アクセスする必要がある場合はうまく動作します。しかし、私は親クラスを取得する必要があるとき、私は以下のレポ機能を使用します。

ParentRepo GetByID:

public Parent GetByID(object id) 
    { 
     IQueryable<Parent> query = context.Set<Parent>(); 

     Parent parentModel = context.Parents.Where(a => a.ParentId == (int)id) 
      .Select(a => new 
      { 
       Parent = a, 
       Children = a.Children.OrderBy(b => b.Seq) 
      }).ToList() 
      .Select(q => q.Parent) 
      .Single(); 

     return parentModel; 
    } 

あなたが見ることができるように、私は(配列で)ここにも子供を注文しました。

これは私がこの作業をすると考えることができる唯一の方法ですが、正しくはないようです。

+0

あなたはいつもアクティブな子供を欲しいですか? –

+0

親を介して取得する場合のみ – getit

+0

「ActiveChild」(Active = trueの場合は子テーブルにマップ)などの継承されたエンティティを追加し、それをParentに関連付けることができます。 –

答えて

0

リポジトリパターンはデータアクセスレイヤを抽象化しているため、残りのアプリケーションはDAL実装の詳細に依存しません。リポジトリは、アプリケーションのニーズに応じて構築する必要があります。基本的には、アプリケーションの視点からリポジトリインタフェースを設計する必要があり、リポジトリはドメイン/ビジネスオブジェクトを返す必要があります。

あなたがしていることを正しく理解していれば、この種の問題をもたらすの周りにのリポジトリを構築しようとしています。

私は誤解したかもしれませんが、単にEFに関連する問題かもしれませんが、問題はリポジトリのデザインが間違っているようです。

関連する問題