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 查询来查询数据库:
- 根据id得到parent
- 插入child
- 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,这有时需要从数据库中获取数据,而这在高度优化的实现中是不需要的。
我正在使用此代码来确定它是否应该创建一个 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 查询来查询数据库:
- 根据id得到parent
- 插入child
- 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,这有时需要从数据库中获取数据,而这在高度优化的实现中是不需要的。