La relation entre les deux objets ne peut pas être défini parce qu'ils sont attachés aux différents objets ObjectContext

J'ai lu quelques questions/réponses qui ont à faire avec ce message d'erreur particulier, mais je ne suis pas tout à fait comprendre la solution appropriée.

J'ai lu de nombreuses fois que vous devez créer le EF4 contexte, de l'utilisation, de l'aliéner. Tout au long de ma demande, je suis le chargement des entités ici et là à l'aide de différentes contexte des objets, et puis finalement souhaitez associer l'ensemble des entités.

J'ai créer une simple application console facilement les causes de l'erreur. Le modèle le plus simple est schématisé suivi par le code.

Comment puis-je obtenir les deux entités différentes à partager le même contexte? Ai-je vraiment besoin de créer un nouveau contexte, de charger les deux entités à nouveau (même si j'ai déjà eux), il suffit de les associer et de les enregistrer?

Si je manque un déjà existant, question/réponse, merci de m'indiquer le bon endroit.

La relation entre les deux objets ne peut pas être défini parce qu'ils sont attachés aux différents objets ObjectContext

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.. il suffit d'appeler context.Attach(o); context.Attach(c); empêche l'erreur. Mais quand j'ai essayé, dans mon application, j'ai eu An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key même si les entités a été chargé dans une manière similaire à cet exemple...
InformationsquelleAutor Steve | 2013-03-07