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.
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 euAn 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...
Vous devez vous connecter pour publier un commentaire.
Vous devriez obtenir une référence à l'enfant et le propriétaire des objets dans le même contexte. Une approche pour ce qui serait d'obtenir les id et ensuite les passer en paramètres à la
AssociateAndSave(int oId, int cId)
méthode.Ensuite, vous pouvez récupérer les références aux objets dans le même contexte et vous rendre la pièce jointe.
Vous ne pouvez pas supprimer des objets d'un contexte, à une instance d'un autre contexte, parce que chaque contexte traces de ses objets séparément.
Un ideea serait de fournir à chacun de vos méthodes d'un paramètre de votre type de contexte afin que vos opérations sont faites dans le même contexte.
EX:
Je vous voulez faire plus de bien, je vous suggère de regarder pour l'injection de dépendance, comme il est très utile dans de l'ORM .
using
blocs).