NHibernate,添加child如果不存在则添加parent

NHibernate, Add parent if not exists when adding child

我正在使用此代码来确定它是否应该创建一个 parent 或者 parent 是否已经存在:

var id = 1;
var parent = Session.Get<Parent>(id);

if (parent == null)
  parent = new Parent();

var child = new Child();

child.Parent = parent;
parent.Children.Add(child);

Session.Save(parent);

现在这似乎非常低效,每次添加 child 时,此方法都会使用 3 个单独的 sql 查询来查询数据库:

  1. 根据id得到parent
  2. 插入child
  3. Insert/update parent(取决于 parent 是否存在)

我可以用更好的方式来做这件事吗?

其实有两种情况。

第一种情况,当我们真的不知道时,如果有一个parent with provided id -没有别的办法。这样的解决方案总是需要 so many sql statements.. 找出是否有 parent 如果没有则插入。

在第二种情况下,如果我们确实知道数据库中有一个parent(提供id) - 我们可以通过内置支持提高效率:Load<Parent>(id)

9.2. Loading an object

... Load() returns an object that is an uninitialized proxy and does not actually hit the database until you invoke a method of the object...

在此处获取更多详细信息:

鉴于你是在进行常规的业务逻辑开发,我不会介意这些查询。

Get还是挺快的,因为它一般都是按主键查找,一般是聚簇索引(不知道SQLite)。

需要找到现有的 parent 以进行链接。您可以使用 Load 推迟实际查询,但根据我的经验,无论如何您都需要 parent。

可能不需要更新 parent。它更新了什么?是否缺少 inverse-mapping?

如果您要为很多记录(不只是一个)做所有事情,您可以考虑其他选择。 (批次,pre-fetching,期货等等。)

如果您认为您需要针对此代码进行高度优化的实现,您应该考虑避免使用 ORM 并以普通 SQL 实现它(并重新检查它是否真的会使用更少的查询)。编写面向 object 的代码需要在内存中有 object,这有时需要从数据库中获取数据,而这在高度优化的实现中是不需要的。