|
0 / 0 / 0
Регистрация: 20.09.2010
Сообщений: 23
|
||||||
Привязка сущности к контексту выбивает исключение30.11.2019, 12:28. Показов 2113. Ответов 5
Метки entity framework (Все метки)
Всем привет.
В своем проекте использую EntityFramework и столкнулся с необъяснимым мне поведением системы. Чтобы максимально упростить и не отвести от сути, попытаюсь смоделировать на простом классическом примере с использованием сущности User и Department с отношением один-ко-многим, т.е. один департамент и много пользователей. Ключевым моментом здесь является то, что ссылки на экземпляры некоторых сущностей у меня сохраняются в процессе работы, а какие-то я определяю из БД. При попытке привязать ("Attach") существующие ссылки в новом контексте у меня возникает исключение, причем такое случается только если навигационные свойства этих ссылок ссылаются на один и тот же объект (точнее если ссылаются на разные ссылки с одним и тем же id, как мы увидим по примеру далее) Код:
System.InvalidOperationException: "Не удалось присоединить сущность типа "ConsoleAppEF.Department", поскольку другая сущность этого же типа уже имеет такое же значение первичного ключа. Причем, если во втором блоке контекста, я не выполняю поиск департамента, а записываю сохранившийся экземпляр из первого блока, то все отлично работает, но я не могу все сущности держать в памяти, только поиск (в данном примере поиск департамента). Заранее скажу что здесь не используется прокси-контейнер для сущностей. И что при поиске департамента из бд, либо "проброске" прямой ссылки, все поля абсолютно одинаковы, отличаются только разве что хэши ссылок, т.е. user1.department != user2.department. Как же выйти из сложившейся ситуации, ведь это довольно частый случай как мне представляется, прошу дать советь. Спасибо!
0
|
||||||
| 30.11.2019, 12:28 | |
|
Ответы с готовыми решениями:
5
Entity Framework. Исключение при обращении к контексту сразу из двух потоков Reflection выбивает исключение Работа с рефлексией,Выбивает исключение,ругается на параметры |
|
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
|
||||||||||||
| 30.11.2019, 13:32 | ||||||||||||
DepartmentSet. Назовите Departments. Оно и так понятно, что это набор из множества разных департаментов.Не надо отдельно добавлять департамент. Когда EF увидит, что User имеет ссылку на объект не входящий в контекст, то автоматически навести на его состояние Added и при вызове SaveChanges() автоматом добавит его в базу. Т.е. должно выглядеть так:
0
|
||||||||||||
|
0 / 0 / 0
Регистрация: 20.09.2010
Сообщений: 23
|
|
| 30.11.2019, 15:36 [ТС] | |
|
Usaga, привет. Спасибо за отклик.
Данный пример смоделирован для отладки возникшей ошибки и определения ее природы, как система предложила обозвать "набор", так и оставил, да и сути вопроса это не решает. У меня на деле первый и второй блоки контекста объеденены по принципу, если существует в бд запись, верну ее, если нет то создам, добавлю в бд и верну ее. Природа возникновения исключения ясна, разные экземпляры сущностей для фреймворка принципиальны, но как теперь выйти то из ситуации ??? Держать в памяти кэш всех департаментов и первостепенно проверять в нем ? Но это не комильфо, в моем реальном случае у каждого юзера будет свой департамент (в боевом проекте это совсем другое). Я к тому что может есть возможность повлиять как то на EF или его механизмы? Стейтами (свойство "State" у "Entry") пробовал по разному, не помогло.
0
|
|
|
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
|
|
| 30.11.2019, 16:17 | |
|
ProgerLink, повлиять на EF очень просто. Достаточно его не обманывать. Если вы знает ID департамента, то именно ID и выставляйте.
0
|
|
|
0 / 0 / 0
Регистрация: 20.09.2010
Сообщений: 23
|
||||||||||||||||
| 30.11.2019, 22:23 [ТС] | ||||||||||||||||
|
Usaga, попробовал я и такой способ, добавил помимо навигационного свойства и явный внешний ключ в сущности User на сущность Department, а при создании "пользователей" указываю не ссылки на департаменты, а их Ид:
Найдено решение, во втором блоке работы с контекстом при поиске департамента в данном примере по имени, необходим вызов "AsNoTracking()" :
Если кто понимает происходящее, прошу разжевать, буду очень признателен. Тем не менее, после этого можно приатачить сущности, менять их поля, в том числе поля самого департамента и при SaveChanges() EF запишет все изменения.
0
|
||||||||||||||||
|
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
|
|||||||
| 01.12.2019, 08:04 | |||||||
Во втором запросе вам не нужна вся сущность Department целиком. Запросите просто её Id и всё. Это и правильнее с точки зрения EF'а и производительнее. Добавлено через 1 минуту Ну и основное правильно работы с EF: сущности не должны кочевать между контекстами.
1
|
|||||||
| 01.12.2019, 08:04 | |
|
Помогаю со студенческими работами здесь
6
Directory.Move() выбивает исключение, подскажите что не так Как правильно отобразить на экране сущности и добавление полей к сущности СМА Indesit WITL106(EU)/Y S/N 091342680075, не блокирует УБЛ. ошибку не выбивает.Ошибку не выбивает реклама не по контексту а по по последним поискам...
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|