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中实现它,并重新检查它是否真的会使用更少的查询。编写面向对象的代码需要在内存中存储对象,这有时需要从数据库中获取数据,而在高度优化的实现中则不需要这些数据