我正在试验 DDD 和 EF 4.1 Code First。
我有一个聚合根 BlogEntry,它看起来与此类似:
public class BlogEntry
{
public long Id { get; set; }
public string Title { get; set;}
public string Content { get; set; }
public DateTime Created { get; set; }
public virtual ICollection<BlogEntryComment> Comments { get; set; }
}
现在,我想在 Web 门户中显示最新的 10 个博客条目的标题以及对这些博客条目的评论量。
目前,这与此类似:
foreach(BlogEntry be in blogEntryRepository.GetLatestBlogEntries())
{
string title = be.Title;
int amountOfComments = be.Comments.Count();
// display title, amountOfComments, ...
}
不幸的是,Entity Framework 在这里所做的是执行一个查询来获取 BlogEntry 对象,然后它对每个 BlogEntry 执行一个查询以检索评论数。
-> EF 生成的 SQL 类似于:
select top 10 * from BlogEntry order by Created desc
然后 10 次:
select count(*) from BlogEntryComment where BlogEntry = @blogEntryId
如何在不急于加载所有评论但仍不针对数据库对每个 BlogEntry 进行查询的情况下防止这种行为 - 但不与任何 DDD 规则发生冲突?
(我希望 EF 对数据库触发是这样的:)
select top 10
be.*,
(select count(*) from BlogEntryComment c where c.BlogEntryId = be.Id) as AmountOfComments
from BlogEntry be order by be.Created DESC
谢谢。
最佳答案
我会选择更简单且最有效的方法 - 只需将 NumberOfComments 添加为 BlogEntry 的属性,随每条评论增加它并保留它。仅基于聚合有责任保持数据一致的事实。考虑到只显示数据的请求数量与实际更新的数量,我认为没有理由每次有人想看到它时都计算这个数字。
关于c# - DDD、EF、聚合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7159649/