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.

Die Beziehung zwischen den beiden Objekten kann nicht definiert werden, weil Sie an verschiedenen ObjectContext-Objekten

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.. Einfach anrufen 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

Schreibe einen Kommentar