Die Beziehung zwischen den beiden Objekten kann nicht definiert werden, weil Sie an verschiedenen ObjectContext-Objekten
Ich habe einige Fragen/Antworten, die haben zu tun mit dieser speziellen Fehlermeldung, bin mir aber nicht ganz verstehen, die geeignete Lösung.
Ich habe schon oft gelesen, dass Sie sollten die EF4 Kontext, verwenden Sie es, dann entsorgen Sie es. Während meiner Anwendung, ich bin be-Einheiten hier und da mit verschiedenen Kontext-Objekte, und klicken Sie dann irgendwann zuordnen möchten, die Einheiten zusammen.
Habe ich erstellen Sie eine einfache Konsolenanwendung, die leicht den Fehler verursacht. Das sehr einfache Modell ist in Diagrammen erfasst, gefolgt von dem code.
Wie bekomme ich die zwei unterschiedlichen Entitäten, die den gleichen Kontext? Muss ich wirklich schaffen einen neuen Kontext laden die beiden Einrichtungen wieder (obwohl ich Sie schon haben), einfach zu verknüpfen und speichern?
Wenn ich es einfach verpasst einen bereits bestehenden, passenden Frage/Antwort, bitte zeigen Sie mich an die richtige Stelle.
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();
}
}
}
context.Attach(o); context.Attach(c);
verhindert den Fehler. Aber wenn ich versuchte dies in meiner eigentlichen Anwendung, bekam ich An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key
obwohl die Personen waren geladen, die in einer ähnlichen Weise zu diesem Beispiel...InformationsquelleAutor Steve | 2013-03-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie einen Verweis auf das Kind und Eigentümer Objekte auch im selben Kontext. Ein Ansatz HIERFÜR wäre, die ids zu ermitteln, und dann übergeben Sie Sie als Parameter an die
AssociateAndSave(int oId, int cId)
Methode.Dann rufen Sie die Verweise auf die Objekte im gleichen Kontext und Sie machen die Anlage aus.
Ich tatsächlich begann, dies zu tun, aber ich dachte, es war ein bisschen verschwenderisch, zum Abfragen der Datenbank für die Entität, die ich bereits geladen hatte, die zuvor aus der Datenbank.
Ich beschlossen zu gehen mit den teilen der beiden Antworten auf diese Frage, aber leider kann ich nicht markieren Sie sowohl Antworten.. 🙂 Wer sucht, der findet dies sollte auch sehen, stackoverflow.com/a/5695009/425871.
danke das funktioniert gut für mich 😉
InformationsquelleAutor Alex Filipovici
Können Sie nicht löschen Sie die Objekte aus einem Kontext mit einer Instanz von einem anderen Kontext, da jeder Kontext-tracks von Ihren Objekten getrennt.
Einem ideea würde jede Ihrer Methoden einer parameter Ihres Kontext-Typs, so dass Sie Ihre Operationen im gleichen Rahmen.
EX:
Ich wollen Sie es zu tun mehr schön, ich schlage vor, Sie suchen für dependency injection, ist es sehr hilfreich, im ORM .
Auch - Sie sagen, dass jeder Kontext verfolgt Ihren Einheiten getrennt, aber der Zusammenhang wurde entsorgt (alle meine Operationen sind in
using
Blöcke).InformationsquelleAutor Freeman