我正在试验 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/

10-12 15:55