Как заставить POCO работать с Linq-to-SQL со сложными отношениями в DDD - PullRequest
4 голосов
/ 08 апреля 2011

Я изо всех сил пытаюсь заставить POCO работать с Linq-to-Sql, когда моя модель домена не управляется таблицами - это означает, что мои объекты домена не совпадают со схемой базы данных.

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

В моей базе данных нет смысла иметь отдельную таблицу AppointmentRecurrence, когда между назначением всегда существует отношение один к одномузапись и ее повторение.Таким образом, таблица «Встречи» имеет столбцы RecurrenceType и RecurrenceValue.RecurrenceType имеет отношение внешнего ключа к таблице RecurrenceTypes, поскольку между типом повторения (шаблоном) и таблицей Appointments существует отношение один ко многим.

Если только нет способа создать правильное отображение между этимидве модели в Linq-to-Sql, мне осталось вручную разрешить несоответствие импеданса в коде.

Это становится еще сложнее, когда дело доходит до запросов к базе данных с использованием шаблона спецификации.Например, если я хочу вернуть список текущих встреч, я могу легко создать объект спецификации, который использует следующее выражение: appt => appt.Recurrence.IsDue.Однако это не переводится в пространство Linq-to-SQL, потому что тип источника выражения не тот, который распознает L2S (например, это не объект L2S).

Так как я могу создать сложное отображениев Linq-to-SQL для поддержки моей доменной модели?

Или есть ли лучший способ реализовать шаблон спецификации в этом случае?Я думал об использовании интерфейсов, которые будут реализованы как моим доменным объектом, так и сущностью L2S (посредством частичных), но это невозможно из-за несоответствия двух графов объектов.

Предложения?

Ответы [ 2 ]

3 голосов
/ 09 апреля 2011

К сожалению, Linq to SQL в значительной степени подталкивает вас к модели «класс на таблицу», она не поддерживает отображение одного класса сущностей на несколько таблиц базы данных.

Более того, к сожалению, ORM очень малоэто будет поддерживать более сложные отображения, и очень немногие, которые делают и предлагают достойную поддержку LINQ.Единственное, в чем я даже отдаленно уверен, это NHibernate (наш опыт работы с Entity Framework оценивает его на самом деле не лучше, чем L2S в этом отношении).

Кроме того, попытка использовать шаблон спецификации в выражениях LINQ будетдовольно сложная задача.

Даже с ORM и даже с действительно сильным абстрагирующим ORM, таким как NHibernate, все еще существует большое несоответствие, которое необходимо преодолеть.

1 голос
/ 11 апреля 2011

Эта запись объясняет, как использовать шаблон спецификации с linq-to-sql.Спецификации могут быть объединены воедино, что создает дерево выражений, которое может использоваться вашим репозиторием и, следовательно, linq-to-sql.

Я еще не пытался реализовать его, но версия linq-to-entity находится в моем списке дел для проекта, над которым я сейчас работаю.

...