我正在使用此代码来确定它是否应创建父级或父母是否已经存在:
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查询查询数据库:
- 根据ID获取父
- 插入孩子
- 插入/更新父(取决于父母是否存在(
我可以更好地做到这一点吗?
实际上有两种情况。
在第一种情况下,当我们确实做不知道时,如果有提供 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中实现(并重新检查它是否确实会使用较少的查询(。编写面向对象的代码需要内存中的对象,这有时需要从数据库中获取数据库中不需要的数据。