2009-01-02 5 views
8

J'utilise l'infrastructure Entity pour créer une nouvelle commande. La commande contient une collection de contacts, une relation plusieurs à plusieurs. Je souhaite ajouter une référence à un contact existant sur la commande lors de la création de la commande. Commande et contactent tous les objets d'une entité.Utilisation de l'infrastructure d'entité pour ajouter des entités existantes à une collection sur une entité nouvellement créée

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(); 

Quand je vais à attacher, cette exception est levée:

« Attach n'est pas une opération valide lorsque l'objet source associé à cette fin connexe est dans un ajouté, supprimé, ou état détaché des objets. chargés en utilisant l'option de fusion NoTracking sont toujours détachés. "

Je sais que je manque probablement une étape ou que je ne comprends pas complètement comment le cadre d'entité gère les relations plusieurs-à-plusieurs.

Répondre

3

Si l'ordre a une propriété Contact, vous pouvez faire:

order.Contact.Add(contact); 

je suggère faire la propriété appelée contact s plutôt que Contact, cependant. "Attach" n'est pas autorisé car vous n'avez pas encore enregistré la commande.

5

L'appel de "Ajouter" indique à Entity Framework que vous souhaitez insérer un nouveau contact. Il ne vous reste donc plus qu'une seule option. Vous devez charger le contact.

est ici le meilleur moyen de le faire:

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

Ou vous pouvez créer une entité de talon (avec la clé que vous connaissez) attach que le contexte (pas la collecte), puis ajouter les sous à la collection . Voir l'astuce 26 pour plus d'informations: http://blogs.msdn.com/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx –

+0

Brilliant! Oui, ce qu'il a dit. –

Questions connexes