DDD, EF, Aggregations

本文关键字:Aggregations EF DDD | 更新日期: 2023-09-27 18:06:20

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

现在,我想在一个门户网站上显示最新的10个博客条目的标题和对这些博客条目的评论数量。

当前实现如下:

foreach(BlogEntry be in blogEntryRepository.GetLatestBlogEntries())
{
    string title = be.Title;
    int amountOfComments = be.Comments.Count();
    // display title, amountOfComments, ...
}

不幸的是,实体框架在这里做的是执行一个查询来获取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

谢谢。

DDD, EF, Aggregations

我会选择更简单和更有效的方法-只需在BlogEntry上添加NumberOfComments作为属性,每条评论增加它并持久保存它。只是基于这样一个事实,即聚合有责任保持数据的一致性。考虑到仅仅显示数据的请求数量与实际更新的数量,我认为没有理由每次有人想要看到它时都计算这个数字。

你可以这样做,但它会创建匿名类型

 var p=   from a in db.BlogEntries
        select new {a, a.Comments.Count};
        var k = p.ToList();   

编辑 . .你可以这样做,

禁用惰性加载;添加评论计数属性到blogEntry域类

  public class BlogEntry
         {
          public int commentCount{
            get
            {
             if(this.comments==null){
               return this._commentCount
             }else{
               return this.Comments.count;
             }
            }
            set{
              this._commentCount=value;
            }

        }
        //other properties...
        }

添加新方法到您的存储库以获取所有注释计数,

var p=   from a in db.BlogEntries
        select new BlogEntry{Id=a.Id,CommentCount= a.Comments.Count , ect..};
        var k = p.ToList();