1

ファイルツリー構造を表す単一のデータベーステーブルがあります。

Files
- Id (int, primary key)
- Name
- ParentId (int, foreign key to Files.Id)

ツリー構造を表示するときに無限ループを防ぐために、子のすべての親が子のIDをParentIdとして持つことができないようにするメソッドを作成するにはどうすればよいですか。

また、これを設計するためのより効率的な方法はありますか?

更新:階層IDをサポートするSQL Server 2008を使用していますが、役に立ちますか?(EFがそれをサポートしているかどうかはわかりません)

4

2 に答える 2

2

「レベル」の値を追加する可能性があります。その場合は、ノードに、それ自体以上のレベルを持つ親がないことを確認する必要があります。ノードを追加するときは、新しい子ノードを親ノードレベル+1に設定します。

乾杯

于 2012-07-09T18:04:42.150 に答える
0

LINQを使用してこれを効率的に作成する方法がわかりません。データベースクエリを多用する必要があります。代わりに、データベース側でチェックするためのストアドプロシージャの作成を検討する必要があります。

別のアプローチは、各要素が親のIDだけでなく、ルート要素からそれ自体までの階層パス全体を格納することです。関連するSOの質問でこの例を参照してください。次に、パスに2つの同一のIDが含まれていないかどうかを確認し、そのようなパスを持つ要素を拒否するだけで済みます。これは、データベース側のトリガーまたはアプリケーションのバリデーターを使用して実行できます。

編集:

HierarchyIdに関しては、少なくとも.NET 4.5までは、EntityFrameworkでHierarchyIdを操作するための組み込みの方法はないようです。このSOの質問を確認することをお勧めします。これには、EntityFrameworkでHierarchyIdを使用できるようにするカスタム実装が含まれています。

于 2012-07-09T17:59:53.730 に答える