EF Code: первое отношение «многие ко многим» без сущности

Я много читал о том, как настроить отношения «многие ко многим» с помощью EF Code First и гибкой конфигурации. Но я не мог понять, почему я должен создавать дополнительную сущность для соединительной таблицы. Предположим, что у меня есть следующие сущности:

Department
----------
Id
Name

Material
----------
Id
Name

Теперь я хочу вести учет материалов для каждого отдела. Так что мне нужно

DepartmentMaterial
-------------------
DepartmentId
MaterialId
Quantity

То, что я прочитал до сих пор, мне нужно 3 объекта: Department, Material и DepartmentMaterial. Так что на самом деле я сопоставляю каждую таблицу с соответствующей сущностью, чего я не собирался делать, когда начал изучать DDD. Я предположил, что EF автоматически сопоставит эту соединительную таблицу, а запросы о количестве материалов можно будет выполнять через отдел.

Следовательно, возможно ли в EF Code First свободно настроить такое отношение без дополнительной сущности?


person Kadir.K    schedule 23.02.2013    source источник


Ответы (1)


Соединительная таблица может оставаться вне концептуальной модели (модели классов), если она только имеет два внешних ключа (DepartmentId, MaterialId). Вы хотите записать некоторые данные о связи. Это нормально, количество принадлежит там. В отделе имеется количество x материала y. Говорить, что отдел имеет количество, бессмысленно.

Это не противоречит принципам DDD. Ассоциативный класс является гражданином первого класса в модели классов. У него может быть даже собственное поведение (например, ограничение количества для определенных комбинаций отдела/материала).

Это означает, что ваша модель не будет содержать ассоциации «многие ко многим», а будет Department 1-n DepartmentMaterial n-1 Material. И вам придется запрашивать материалы отделов через соединительную таблицу. Это очень распространенная ситуация. В реальной жизни я редко вижу чистые соединительные таблицы. Это предметы коллекционирования.

Пример запроса:

var query = from d in db.Departments
            from dm in d.DepartmentMaterials
            select new { Department = d, Materials = dm.Select(x => x.Material)};
person Gert Arnold    schedule 23.02.2013