8

I am using the Entity framework to create a new order. The order contains a collection of contacts, a many to many relationship. I want to add a reference to an existing contact on the order on creation of the order. Both Order and Contact a Entity Objects.

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

When I go to attach, this exception is thrown:

"Attach is not a valid operation when the source object associated with this related end is in an added, deleted, or detached state. Objects loaded using the NoTracking merge option are always detached."

I know I'm probably missing a step or not fully understanding how the entity framework handles many-to-many relationships.

2 Answers 2

5

"Attach" is not allowed because you haven't saved the order yet. Calling "Add" tells Entity Framework that you want to insert a new contact. So you are left with only one option. You need to load the contact.

Here's the fastest way to do that:

OrderDetails context = new OrderDetails();
Contact contact = context.GetObjectByKey(new EntityKey("OrderDetails.Contact", "contact_id", existingContactId));
order.Contact.Add(contact);
Sign up to request clarification or add additional context in comments.

2 Comments

Or you can create a stub entity (with the key you know) attach that to the Context (not the collection) and then Add the sub to the collection. See Tip 26 for more: blogs.msdn.com/alexj/archive/2009/06/19/…
Brilliant! Yes, what he said.
3

If Order has a property Contact, then you can do:

order.Contact.Add(contact);

I would suggest making the property called Contacts rather than Contact, though.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.