Ho letto alcune domande/risposte che hanno a che fare con questo particolare messaggio di errore, ma non sto capendo la soluzione appropriata.La relazione tra i due oggetti non può essere definita perché sono collegati a diversi oggetti ObjectContext
Ho letto molte volte che è necessario creare il contesto EF4, usarlo, quindi smaltirlo. Durante la mia applicazione, sto caricando le entità qua e là usando diversi oggetti di contesto, e poi eventualmente voglio associare le entità insieme.
Ho creato un'applicazione di console semplice che causa facilmente l'errore. Il modello molto semplice è schematizzato seguito dal codice.
Come è possibile ottenere le due entità diverse per condividere lo stesso contesto? Devo davvero creare un nuovo contesto, caricare nuovamente le due entità (anche se li ho già), semplicemente per associarle e salvare?
Se semplicemente mi sono perso una domanda/risposta già esistente, vi prego di indicarmi il posto giusto.
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 .. Semplicemente chiamando 'context.Attach (o); context.Attach (c); 'impedisce l'errore. Ma quando ho provato questo nella mia applicazione reale, ho ottenuto un oggetto con la stessa chiave già esistente in ObjectStateManager. ObjectStateManager non può tracciare più oggetti con la stessa chiave anche se le entità sono state caricate in modo simile a questo esempio ... – Steve