さて、私はデータベースにツリーを保存しようとしているので、変更されたプレオーダーツリートラバーサルメソッドを使用しています。
次の列のテーブルがあります。
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を使用して、他のエンティティで発生する可能性のある他の変更を考慮した変更を行うことは可能ですか?
ありがとう。ダイムロック。