C# NHibernate,如果添加子级时不存在,则添加父级

C# NHibernate,如果添加子级时不存在,则添加父级,c#,sqlite,nhibernate,C#,Sqlite,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); 现在这似乎效率很低,每次添加子项

我使用此代码来确定是否应该创建父级,或者父级是否已经存在:

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语句。。找出是否有父项,如果没有则插入

在第二个场景中,如果我们确实知道数据库中有一个具有提供id的父级,那么我们可以使用内置支持Loadid使其更高效

。。。Load返回一个未初始化的代理和 直到调用 对象

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


事实上有两种情况

在第一种情况下,当我们真的不知道,如果有提供id的父母-没有其他方法。这样的解决方案总是需要这么多sql语句。。找出是否有父项,如果没有则插入

在第二个场景中,如果我们确实知道数据库中有一个具有提供id的父级,那么我们可以使用内置支持Loadid使其更高效

。。。Load返回一个未初始化的代理和 直到调用 对象

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


鉴于您正在进行常规的业务逻辑开发,我不介意这些查询

Get相当快,因为它通常通过主键执行查找,主键通常是不知道SQLite的聚集索引

无论如何都需要找到现有的父级链接。您可以使用Load延迟实际查询,但根据我的经验,您仍然需要父查询

可能不需要更新父级。它更新了什么?是否缺少反向映射

如果你做了很多事情,不仅仅是一个记录,你可以考虑其他的选择。批量、预取、期货等等


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

鉴于您正在进行常规业务逻辑开发,我不介意这些查询

Get相当快,因为它通常通过主键执行查找,主键通常是不知道SQLite的聚集索引

无论如何都需要找到现有的父级链接。您可以使用Load延迟实际查询,但根据我的经验,您仍然需要父查询

可能不需要更新父级。它更新了什么?是否缺少反向映射

如果你做了很多事情,不仅仅是一个记录,你可以考虑其他的选择。批量、预取、期货等等

如果你认为你需要一个高度优化的实现来实现这个代码,你应该考虑避免使用ORM并在普通SQL中实现它,并重新检查它是否真的会使用更少的查询。编写面向对象的代码需要在内存中存储对象,这有时需要从数据库中获取数据,而在高度优化的实现中则不需要这些数据