Я использую платформу Entity для создания нового заказа. Заказ содержит набор контактов, отношения «многие ко многим». Я хочу добавить ссылку на существующий контакт в заказе на создание заказа. И заказ, и контакт с объектами сущности.
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();
Когда я перехожу к присоединению, возникает это исключение:
«Присоединение не является допустимой операцией, когда исходный объект, связанный с этим связанным концом, находится в добавленном, удаленном или отсоединенном состоянии. Объекты, загруженные с использованием опции слияния NoTracking, всегда отсоединяются».
Я знаю, что, вероятно, пропускаю какой-то шаг или не совсем понимаю, как структура сущности обрабатывает отношения «многие ко многим».





Если в Заказе есть свойство «Контакт», вы можете:
order.Contact.Add(contact);
Я бы посоветовал сделать свойство Contacts, а не Contact.
«Прикрепить» нельзя, потому что вы еще не сохранили заказ. Вызов «Добавить» сообщает Entity Framework, что вы хотите вставить новый контакт. Таким образом, у вас остается только один вариант. Вам нужно загрузить контакт.
Вот самый быстрый способ сделать это:
OrderDetails context = new OrderDetails();
Contact contact = context.GetObjectByKey(new EntityKey("OrderDetails.Contact", "contact_id", existingContactId));
order.Contact.Add(contact);
Блестяще! Да, что он сказал.
Или вы можете создать объект-заглушку (с известным вам ключом), присоединить его к контексту (не к коллекции), а затем добавить подпрограмму в коллекцию. См. Совет 26 для получения дополнительной информации: blogs.msdn.com/alexj/archive/2009/06/19/…