Entity Framework 4 Привязка «многие ко многим»

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

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

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

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

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

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

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

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


person Chad Gilbertson    schedule 01.09.2010    source источник
comment
Не могли бы вы пояснить, почему вы не используете один и тот же контекст данных для EmployeeRepository и DepartmentRepository?   -  person Jacob    schedule 02.09.2010
comment
Джейкоб: мне нужно разделить изменения сотрудников и отделов, поскольку их можно редактировать одновременно. Если они используют один и тот же контекст данных, попытка сохранить один приведет к сохранению другого. Вызов сохранения изменений для отдела не должен сохранять изменения для сотрудника и наоборот. Отделы, имеющие свой собственный контекст данных, также позволяют мне синхронизировать каждый элемент управления пользовательского интерфейса с отделами, поскольку несколько сотрудников могут редактироваться одновременно. Добавление отдела продаж в отделы автоматически обновит элемент управления пользовательского интерфейса отделов для всех экземпляров сотрудника.   -  person Chad Gilbertson    schedule 02.09.2010


Ответы (2)


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

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

Отдел - Сотрудник отдела - Сотрудник

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

person jeroenh    schedule 01.09.2010

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

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

person Ladislav Mrnka    schedule 01.09.2010