システム内には、すべて基本クラスEntityから継承したオブジェクトが多数あります。これらのオブジェクトは、1対1、1対多、多対多など多くの関係を持っています。私はWCFを使用しているので、私のDbContextオブジェクトはすべてのCRUD呼び出しで切断されます。これにより、関係のあるオブジェクトに対する基本的なCRUD操作に関するいくつかの問題が発生しました。エンティティフレームワーク:複雑な関係を持つオブジェクトのCRUD
たとえば、基本的な親子関係を持つオブジェクトがあります。私はノードと呼ぶ。
[DataContract(IsReference=true)]
public partial class Node : Entity
{
[DataMember]
public long ID { get; private set; }
[DataMember]
public long? ParentID { get; set; }
[DataMember]
public List<Node> Children { get; set; }
}
は、私はすでに存在しても、まだ存在していない子を持つノードを追加するには、子を持つ新しいノードを追加できるようにしたいです。
// Node with a new child node
Node nodeWithNewChild = new Node()
{
Children = new List<Node>()
{
new Node()
}
}
// A pre-existing child node
Node existingChildNode = new Node();
// Node with a pre-existing child node
Node nodeWithExistingChild = new Node()
{
Children = new List<Node>()
{
existingChildNode
}
}
問題は、どのように私がそれを行っても、Entity Frameworkは混乱します。
私は基本的なDbContext.Nodes.Add
の操作を使用すると、テストケースで既存の子を駄目です。データベース内の既存の子を重複して入力し、この新しい子に正しいParentID
を与えます。これは、子供をループして、最初に子どもにDbContext.Nodes.Add
を使用すると発生します。
すべての子をループして、すべての子にDbContext.Nodes.Attach
を使用してからDbContext.Nodes.Add
を親に使用しましたが、これは新しい子供のテストケースで例外を発生させます。
System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:ストア 更新、挿入、または削除ステートメントが 行(0)の予想外の数に影響を与えました。エンティティ がロードされたため、エンティティが変更または削除されている可能性があります。 ObjectStateManagerエントリを更新します。 ...
たとえば、子を持つ子を持つノードを子などに追加した場合など、これがどうなるか心配です。 CRUDメソッドがすべての有効なオブジェクト構造に適切に反応するようにしたい。
私が見つけることができたことから、EFはこの種のものには意味がない、あるいは悪いことがあります。自分で関係を管理することが最善です。これは本当ですか?もしそうなら、私はそれに従うことができる例はありますか?任意のヒントなど?
私はリフレクションを使用する関係を自分自身で処理する方法を使い始めましたが、基本的な問題であるはずのものを解決するばかげた方法だと思います。
これは機能しますが、子供がいるノードがある場合はどうなりますか? 'while(childNode.Children!= null)'や何かする必要がありますか? – OpticalDelusion
@OpticalDelusion:答えにEditを入れました。それが動作するかどうかは分かりませんが、試してみる価値があります。 – Slauma
ええ、私は再帰の代わりにwhileループを使ってこれを行うことを計画していました。入力いただきありがとうございます。 – OpticalDelusion