我正在尝试将聚合根模式应用于我的域。我正在使用带有 POCO 实体生成器的实体框架 4。
我有两个实体: MailingTask EmailLog 具有一对多的关系。(MailingTask 有很多 EmailLogs)。EF4 在 MailingTask 上生成一个导航属性:
public virtual ICollection<EmailLog> EmailLogs
在我的模型中,我永远不想直接访问 EmailLogs,总是通过其父 MailingTask。这是通过以下方式强制执行的:
- 只有一个 MailingTask 存储库,所以我不能直接查询 EmailLogs 表。
- 仅通过此导航属性获取 EmailLogs。
我有时需要计算 MailingTask 的 EmailLogs 数量。这是通过在导航属性上使用 LINQ 来实现的:
mailingTask.EmailLogs.Count();
但这在应用程序端(而不是数据库服务器)执行。(而且它非常昂贵,因为我有很多用于 MailingTask 的 EmailLogs。)我阅读了一些关于这种行为的帖子,似乎 EF4 导航属性不能用作 IQueryable(在数据库端执行)。当您访问导航属性时,EF4 会在内存中加载所有包含所有列的条目,并在内存中应用 LINQ 表达式。对于 Count() 语句,这很痛苦。
我相信我将不得不改变我的模型以适应这种专门的查询(可能添加一个具有查询能力的 EmailLogsRepository)。对我来说,似乎 EF4 不能很好地支持聚合根模式。或者我可能遗漏了一些关于聚合根模式以及它应该如何在 EF4 方面实现的内容......
有没有人遇到过这种情况并能够解决这个问题?nHibernate 或其他 ORM 是否更好地支持这一点?