Entity Framework 4 привязка многих ко многим - PullRequest
0 голосов
/ 02 сентября 2010

Entity Framework 4 сводит меня с ума. Такая ситуация:

Сущность сотрудника - ассоциация "многие ко многим" - Субъект департамента

Я получаю сотрудников из репозитория Employee и отделов из репозитория DepartmentRepository.Каждый репозиторий использует свой собственный контекст данных.В моем пользовательском интерфейсе есть список отделов (из DepartmentRepository), которые нужно выбрать для сотрудника.

Когда выбран Department для сотрудника, он связывает Department из контекста данных DepartmentRepository, поэтому при попытке сохранитьСотрудник жалуется с изящным исключением.

Мне нужно отделить контекст данных для Отделов от контекста данных для Сотрудников, потому что Отделы могут быть изменены, и вызов сохранения изменений в DepartmentRepository также не может сохранить Сотрудника.

Отдельные контексты данных отлично работают для моей ассоциации многие со значениями 0 или 1, потому что я могу просто связать свойство внешнего ключа, а не экземпляр сущности.

Единственный обходной путь, о котором я могу подумать, - это исправитьсбор в ассоциации путем создания другого DepartmentRepository с тем же контекстом данных, что и EmployeeRepository, и разрешения отделов DepartmentRepository с отделами, извлеченными из DepartmentRepository, с EmployeeRepositorydatacontext, но это просто ужасный, вонючий дизайн и неприемлемое «решение».

На данный момент меня не волнует стратегия генерации кода (хотя POCO было бы неплохо), мне действительно просто нужно что-тоэто сработает, и Entity Framework 4 не так уж страшен при создании определений модели, поэтому я хотел бы придерживаться этого.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2010

Основная причина вашей проблемы - ваше требование разделить контексты данных между двумя вашими репозиториями. Чтобы управлять отношением «многие ко многим», EF полагается на то, что все находится в одном объектном контексте.

Если вам действительно необходимо обеспечить разделение между этими двумя контекстами, вы можете явно смоделировать отношение «многие ко многим», то есть с промежуточным объектом как два отношения «многие к одному»:

Департамент - DepartmentEmployee - Сотрудник

Объект DepartmentEmployee «известен» в обоих контекстах. Через DepartmentRepository вы можете добавлять / удалять сотрудников (только через их Id) и наоборот. Не должно быть никаких свойств навигации от DepartmentEmployee к Department или Employee.

0 голосов
/ 02 сентября 2010

Проверьте методы отсоединения и присоединения в контексте. Вы можете отсоединить сущность от одного контекста и присоединить ее к другому. Но в этом случае вы теряете отслеживание изменений и вам придется вручную устанавливать состояние объекта с помощью context.ObjectStateManager.ChangeObjectState.

Но вы должны подумать о дизайне вашего приложения. В упомянутом сценарии вы не должны использовать два разных контекста объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...