Я пытаюсь применить шаблон совокупного корня к своему домену. Я использую Entity Framework 4 с генератором сущностей POCO.
У меня есть две сущности: MailingTask EmailLog с отношением «один ко многим». (MailingTask имеет множество журналов электронной почты). EF4 создает свойство навигации в MailingTask:
public virtual ICollection<EmailLog> EmailLogs
В моей модели я никогда не хочу напрямую обращаться к EmailLogs, всегда через его родительский MailingTask. Это обеспечивается:
- Имея только репозиторий MailingTask, поэтому я не могу напрямую запросить таблицу EmailLogs.
- Получение журналов электронной почты только через это свойство навигации.
Иногда мне нужно подсчитать количество журналов электронной почты для MailingTask. Это достигается с помощью LINQ в свойстве навигации:
mailingTask.EmailLogs.Count();
Но это выполняется на стороне приложения (а не на сервере базы данных). (И это очень дорого, поскольку у меня много журналов электронной почты для MailingTask.) Я прочитал несколько сообщений об этом поведении, и похоже, что свойства навигации EF4 не могут использоваться как IQueryable (выполняются на стороне базы данных). При доступе к свойству навигации EF4 загружает ВСЕ записи со ВСЕМИ столбцами в памяти и применяет выражение LINQ в памяти. Для оператора Count () это очень больно.
Я считаю, что мне придется изменить мою модель, чтобы приспособить этот специализированный запрос (возможно, добавив EmailLogsRepository с возможностями запросов). Мне кажется, что EF4 не очень хорошо поддерживает шаблон Aggregate Root. Или, может быть, мне что-то не хватает о шаблоне агрегированного корня и о том, как его следует реализовать в отношении EF4 ...
Кто-нибудь сталкивался с такой ситуацией и смог ее решить? Поддерживает ли это nHibernate или другой ORM лучше?