Использование структуры сущностей для добавления существующих сущностей в коллекцию на вновь созданной сущности

Я использую платформу 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, всегда отсоединяются».

Я знаю, что, вероятно, пропускаю какой-то шаг или не совсем понимаю, как структура сущности обрабатывает отношения «многие ко многим».

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
11 256
2

Ответы 2

Если в Заказе есть свойство «Контакт», вы можете:

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/…

Alex James 16.12.2009 08:35

Блестяще! Да, что он сказал.

Michael L Perry 24.12.2009 19:55

Другие вопросы по теме