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.
"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);