この特定のエラーメッセージに関するいくつかの質問/回答を読んだことがありますが、2つのオブジェクト間の関係は、異なるObjectContextオブジェクトにアタッチされているため、定義できません。
私は何度もEF4コンテキストを作成して使用してから処分する必要があります。私のアプリケーションでは、さまざまなコンテキストオブジェクトを使用して、ここではエンティティをロードしていますが、最終的にエンティティを関連付けることを望んでいます。
簡単にエラーが発生する単純なコンソールアプリケーションを作成しました。非常に単純なモデルが図式化され、コードが続きます。
同じコンテキストを共有するために2つの異なるエンティティを取得するにはどうすればよいですか?私は実際に新しいコンテキストを作成し、2つのエンティティを再度ロードする必要がありますか(既にそれらを持っていても)、単純にそれらを関連付けて保存しますか?
すでに存在する適切な質問/回答が欠けていた場合は、私に正しい場所を指摘してください。
internal class Program {
private static void Main(string[] args) {
DeleteAllEntities();
CreateInitialEntities();
Owner o = LoadOwner();
Child c = LoadChild();
AssociateAndSave(o, c);
}
private static void AssociateAndSave(Owner o, Child c) {
using (var context = new ModelEntities()) {
// Exception occurs on the following line.
o.Children.Add(c);
context.Attach(o);
context.SaveChanges();
}
}
private static Owner LoadOwner() {
using (var context = new ModelEntities()) {
return ((from o in context.Owners
select o).First());
}
}
private static Child LoadChild() {
using (var context = new ModelEntities()) {
return ((from c in context.Children
select c).First());
}
}
private static void CreateInitialEntities() {
using (var context = new ModelEntities()) {
Owner owner = new Owner();
Child child = new Child();
context.Owners.AddObject(owner);
context.Children.AddObject(child);
context.SaveChanges();
}
}
private static void DeleteAllEntities() {
using (var context = new ModelEntities()) {
List<Child> children = (from c in context.Children
select c).ToList();
foreach (var c in children)
context.Children.DeleteObject(c);
List<Owner> owners = (from o in context.Owners
select o).ToList();
foreach (var o in owners)
context.Owners.DeleteObject(o);
context.SaveChanges();
}
}
}
Hmm ..単に 'context.Attach(o);を呼び出します。 context.Attach(c); 'はエラーを防ぎます。しかし、私が実際のアプリケーションでこれを試したところ、 'ObjectStateManagerに同じキーを持つオブジェクトがすでに存在しています。エンティティがこの例と同様の方法でロードされていても、ObjectStateManagerは同じキーを持つ複数のオブジェクトを追跡できません。 – Steve