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