nhibernate,添加孩子时添加父母(如果不存在)



我正在使用此代码来确定它是否应创建父级或父母是否已经存在:

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);

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

  1. 根据ID获取父
  2. 插入孩子
  3. 插入/更新父(取决于父母是否存在(

我可以更好地做到这一点吗?

实际上有两种情况。

在第一种情况下,当我们确实做不知道时,如果有提供 iD 的父母,则没有其他方法。这样的解决方案将始终需要如此多的 sql语句..找出是否有父母并插入。

在第二种情况下,如果我们确实知道 db中有一个父(提供 ID ( - 我们可以在内置支持的情况下使其更有效:Load<Parent>(id)

9.2。加载对象

... Load()返回一个是一个非初始化的代理的对象,并且 是否实际上不会点击数据库,直到您调用一种方法 对象...

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

nhibrenate Query&lt; t&gt; t&lt; t&gt; t&gt;和load&lt; t&gt;

鉴于您处于常规的业务逻辑开发中,我不介意这些查询。

Get非常快,因为它通常通过主键执行查找,这通常是群集索引(不知道sqlite(。

无论如何都需要发现现有的父母。您可以使用Load推迟实际查询,但是根据我的经验,您无论如何都需要父母。

更新父母可能是不必要的。它更新什么?是否缺少逆映射?

如果您正在为很多记录(不仅有一个(做整个事情,则可以考虑其他选项。(批次,预取,期货等等。(

如果您认为需要对本代码进行高度优化的实现,则应考虑避免使用ORM并在Plain SQL中实现(并重新检查它是否确实会使用较少的查询(。编写面向对象的代码需要内存中的对象,这有时需要从数据库中获取数据库中不需要的数据。

最新更新