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
谢谢。
我会选择更简单和更有效的方法-只需在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();