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

How to map a collection efficiently in an ORM?

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

添加新评论时,假设是这样的:

post.Comments.Add(newComment);

系统将请求 SELECT 在添加新评论之前加载所有现有评论。但如果有数百条评论,那么它就很重了。是否可以避免负载?感谢您的任何建议。

这是 ORM 的经典问题。这里没有灵丹妙药。

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

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

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

您导致从数据库中提取一百次 - 实际上导致了 Select n+1 issue

所以,这是一个固执己见的设计选择,一些 ORM 只会获取 post,其他的会包含特殊语法,如 .Include,这表明你也对评论感兴趣,而有些则会忽略这完全是浪费请求。

您担心插入新评论的性能,所以以下选项可能会有所帮助:

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