2013-02-23 2 views
0

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

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

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

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

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

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

Следовательно, возможно ли это в коде EF Сначала для того, чтобы свободно настраивать такое отношение без дополнительного объекта?

ответ

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)}; 
Смежные вопросы