2012-02-04 16 views
0

EF4(コードファースト)またはnHibernateでリポジトリパターンを使用して階層構造を管理する方法についてのアプローチ/チュートリアルをお勧めしますか?一例として、EFまたはNHibernateを使用したリポジトリパターンの階層構造

、私は次のように表示してきたとしましょう:

Topic 
-> Comment1 
    -> Comment1_1 
    -> Comment1_2 
     -> Comment1_2_1 

理想的なクラス構造とどのようにそれがORMとリポジトリのパターンでアップ配線すべきは何ですか?リポジトリパターンとEF/nHibernateに関する記事はたくさんありますが、階層構造でそれらを使用しているものは見つかりませんでした。クラス構造上の

私の考え:

Class Topic 
    { 
    public int ID {get;set;} 
    public string Topic {get;set;} 
    } 

Class Comment 
    { 
    Public int ID {get;set;} 
    Public int TopicID {get;set} 
    Public string Comment {get;set;} 
    Public int ParentID {get;set;} //recursion will happen here 
    Public int Level {get;set;} //Can be used to bypass recursion and display topic with all comments with indention based on Level 
    } 

答えて

2

は、おそらくあなたは、リレーショナルモデルにツリーをマップしようとしています。 how to map a tree in nhibernateをご覧ください。

1

すべてのコメントが親トピックを参照する場合は、それ以上何もする必要はありません。コメントには親が正しく設定されているため、常に関連するすべてのコメントを含むトピックをロードし、アプリケーションロジック内の階層をトラバースします(この場合、トラバーサルをより簡単にするための依存関係のコレクションも必要です)。

したがって、この構造で作業するためのアルゴリズムは次のようになります。

  1. 負荷トピックとすべての関連するコメント(すべてのコメントは、階層内の位置のにもかかわらず、TopicIdを持っている) - あなたはすべてのデータを持っているので、すべてのEFのものはここで終了あなたが3(再帰)
  2. 012に進み、現在処理コメントの各従属コメントについて
  3. が必要ParentIdは、各処理されたコメントについて
  4. nullであるすべてのコメントがすべてを行う
  5. プロセスを必要とします

より複雑な状況は、いくつかのコメントを別々に扱う場合です。たとえば、指定されたコメントのコメント階層を取得するなどです。そのような場合は、ネイティブSQLを使用してコメントを読み込んで、階層クエリに対してCTE(一般的なテーブル式 - SQL Server 2005以降のみ)を活用する必要があります。このアプローチは@pborovikによって投稿された記事に記述されており、EFの場合は非常に似ています。

+0

こんにちは..ありがとう。これは理想的なことです。しかし、私は、コメントが部分的に読み込まれているサイトを見てきました。あなたがスクロールし続けると、コメントのチャンクが追加され続けています。おそらくそれはTake()Skip()メソッドを使用して実現できますが、興味深い部分はどれだけ読み込むかです。 1つのトップレベルのコメントは、すべてのサブコメントを取得する必要があります。 – helloworld

+0

そのような場合は、クエリごとに読み込まれるトップレベルのcomentsの数を制御するためにSQLを使用する必要があります。それぞれのトップレベルのコメントもすべての依存関係を読み込みます。 –

関連する問題