0

さて、私はデータベースにツリーを保存しようとしているので、変更されたプレオーダーツリートラバーサルメソッドを使用しています。

次の列のテーブルがあります。

IDNode
IDRootNode
IDParentNode
Left
Right

私のテーブルには2つの固有の制約が(IDRoot, Left)あり(IDRoot, right)ます。ツリーでは、同じルートと同じ左、または同じルートと同じ右を持つ2つのノードを持つことはできません。これが、この2つの制約を使用する理由です。

さて、今、私は3つのノードを持つツリーを持っています:

Node A
IDNode = 1
IDRootNode = 1
IDParentNode = 1
Left = 1
Right = 6

Node B
IDNode = 2
IDRootNode = 1
IDParentNode = 1
Left = 2
Right = 3

Node C
IDNode = 3
IDRootNode = 1
IDParentNode = 1
Left = 4
Right = 5

現在、Bノードに新しい子を追加しようとしています。したがって、いくつかの操作では、データベースに変更を保存する前に、ノードの次の状態を取得します。

Node A
IDNode = 1
IDRootNode = 1
IDParentNode = 1
Left = 1
Right = 8

Node B
IDNode = 2
IDRootNode = 1
IDParentNode = 1
Left = 2
Right = 5

Node C
IDNode = 3
IDRootNode = 1
IDParentNode = 1
Left = 6
Right = 7


New node D
IDNode = 3
IDRootNode = 1
IDParentNode = 2
Left = 3
Right = 4

これはすべてのノードの正しいデータですが、変更を送信すると、左右の値を変更しようとしているため、一意キーの例外が発生します。

問題はノードBにあり、右のフィールドを5に設定しようとしていますが、この値はデータベースのノードCに割り当てられています。

したがって、EFが変更を加えると、その変更が現在のレジスタに適用され、コンテキスト内のエンティティの情報ではなく、データベース内の情報とデータが比較されると思います。したがって、ノードBを更新しようとすると、エンティティ値ではなくデータベースの値が考慮されるため、データベースの右側のフィールドにノードCの値が5である場合、SQLServerはエラーをスローします。一意の制約の。EFがノードCの値が7であるエンティティデータを考慮に入れる場合、問題はありません。

データベースの制約を削除すると、すべてが正常に機能し、データは一貫性がありますが、EFを使用してデータベースを設計し、設計はデータアクセステクノロジに依存しません。

私は正しいですか?EFを使用して、他のエンティティで発生する可能性のある他の変更を考慮した変更を行うことは可能ですか?

ありがとう。ダイムロック。

4

1 に答える 1

1

例で示しているものは、まったく木のようには見えません。変更したサンプルを確認しましょう。

  • ノードAのID=1、RootID = 1、ParentID = 1です。ルートノードに親を設定するにはどうすればよいですか?ParentIDはNULLである必要があります。
  • ノードAのLeftID=1です。それで、ノードAはそれ自体を指していますか?あれはどんな木?スレッド化されたツリーノードでさえ、通常はそれ自体を指していません。
  • ノードBのParentID=1ですが、ノードAにはLeftID=2もRightID=2もありません。ノードBがノードAの直接の子ではない場合、ノードAをノードBの直接の親にするにはどうすればよいですか。
  • そして、より多くの同様の問題
  • ところで。独自の制約を使用して、リーフまたは不完全なノード(LeftID=NULLまたはRightID=NULLのノード)をどのようにモデル化しますか?これらの制約は、LeftID=NULLの単一ノードとRightID=NULLの単一ノードのみが存在できることを示しています。

次にEFの問題について説明します。EFは固有の制約を理解していません。EFは、状態を確認するためにデータベースに対して追加のクエリも実行しません。すべてのクエリはユーザーによって実行されます(遅延読み込みもコードによって実行されます)。

EFがノードCを更新する前にノードBを更新しようとしているデータベースで実行された更新コマンドの順序が正しくないという問題が見つかった可能性があります。EF更新の順序はデータベース内の関係によって決まりますが、双方向の関係によりEFがコマンドの正しい順序を選択できません。このような場合、通常は例外がスローされるため、自己参照関係を持つテーブルでモデル化されたツリー構造がないのではないかと疑われます。このような場合、EFは正しいコマンド順序を割り当てることができません。

この場合、更新を実行するには手動で更新を書き込む必要があると思います。

于 2012-05-26T14:07:08.347 に答える