如何在ORM中有效地映射集合?

时间:2015-04-16 15:53:35

标签: performance orm

我有一个包含两个实体的简单模型:

  • 发布实体 - 聚合根,可以有一个评论列表 - >评论
  • 评论实体

添加新评论时,请说出来:

post.Comments.Add(newComment);

系统将在添加新注释之前请求SELECT加载所有现有注释。但是,如果有数百条评论,那么它是正确的。是否可以避免负载?谢谢你的任何建议。

2 个答案:

答案 0 :(得分:2)

这是ORM的典型问题。这里没有银弹。

如果您提前加载所有注释,则会导致浪费大量带宽,因为可能不需要所有注释。

另一方面,如果您没有提前加载评论,并且有人做了类似的事情:

for(var i = 0; i < 100; i++){
     doSomethingWith(post.Comments[i]); 
}

您正在从数据库中导致一百次提取 - 有效地导致Select n+1 issue

所以,这是一个自以为是的设计选择,一些ORM只会获取帖子,其他ORM会包含.Include这样的特殊语法,表明你对评论也感兴趣,有些人会完全忽略这些并浪费请求。

答案 1 :(得分:1)

您关注插入新评论的效果,因此以下选项可能有所帮助:

  1. 从nhibernate重用db连接,编写自己的插入命令
  2. 在Dapper的支持下,编写插入查询https://github.com/StackExchange/dapper-dot-net