2009-01-02 16 views
8

Ich verwende das Entity-Framework, um eine neue Reihenfolge zu erstellen. Die Bestellung enthält eine Sammlung von Kontakten, eine Viele-zu-Viele-Beziehung. Ich möchte einen Verweis auf einen vorhandenen Kontakt in der Bestellung bei der Erstellung des Auftrags hinzufügen. Eine Entity-Objekte ordnen und kontaktieren.Verwenden des Entitätsframeworks zum Hinzufügen vorhandener Entitäten zu einer Auflistung in einer neu erstellten Entität

Order order = new Order(); 

//set details on order 

Contact contact = new Contact(); 

EntityKey contactKey = 
        new EntityKey("OrderDetails.Contact", 
         "contact_id", contact.Key.Id); 

contact.EntityKey = contactKey; 
contact.contact_id = contact.Key.Id; 

order.Contact.Attach(contact); // throws an exception! 

OrderDetails ordTable = new OrderDetails(); 
      ordTable.AddToOrder(order); 
      int result = orgTable.SaveChanges(); 

Wenn ich befestigen gehen, wird diese Ausnahme ausgelöst:

„Bringen Sie keine gültige Betrieb ist, wenn das Quellobjekt mit diesem verknüpften Ende zugeordnet ist, in einem hinzugefügt, gelöscht oder abgenommenen Zustand Objekte. geladen mit der NoTracking Merge-Option sind immer getrennt. "

Ich weiß, dass ich wahrscheinlich einen Schritt verpasse oder nicht vollständig verstehe, wie das Entitätsframework viele-zu-viele-Beziehungen handhabt.

Antwort

3

Iforder eine Eigenschaft Kontakt hat, dann können Sie tun:

order.Contact.Add(contact); 

Ich würde vorschlagen, die Eigenschaft namens Kontakt s statt Kontakt zu machen, though.

5

"Anhängen" ist nicht erlaubt, weil Sie die Bestellung noch nicht gespeichert haben. Durch den Aufruf von "Hinzufügen" wird Entity Framework mitgeteilt, dass Sie einen neuen Kontakt einfügen möchten. Sie haben also nur eine Option. Sie müssen den Kontakt laden.

Hier ist der schnellste Weg, das zu tun:

OrderDetails context = new OrderDetails(); 
Contact contact = context.GetObjectByKey(new EntityKey("OrderDetails.Contact", "contact_id", existingContactId)); 
order.Contact.Add(contact); 
+5

Oder Sie können eine Stub Entität erstellen (mit dem Schlüssel, den Sie kennen) befestigen, dass auf den Kontext (nicht die Sammlung) und dann den Unter In die Sammlung . Siehe Tipp 26 für mehr: http://blogs.msdn.com/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx –

+0

Brilliant! Ja, was er gesagt hat. –

Verwandte Themen