NHibernate-加载实体的问题

NHibernate-加载实体的问题,nhibernate,Nhibernate,我在NHibernate中遇到了一些问题。在开始维护这个应用程序时,我注意到的第一件事是,它们似乎并不急于在任何地方加载 我的第一个停靠港是Fetch。但这引发了一个异常,表示当集合是IList时,它无法完成该操作。很明显,这一定是一个ICollection。我几乎不能改变域名,只是为了适应Fetch 接下来,我看了。未来和。未来价值。由于提供商不支持,因此无法访问 这给我留下了NHibernateUtil.Initialize。作为概念证明,我编写了以下代码: var leppp = _rep

我在NHibernate中遇到了一些问题。在开始维护这个应用程序时,我注意到的第一件事是,它们似乎并不急于在任何地方加载

我的第一个停靠港是Fetch。但这引发了一个异常,表示当集合是IList时,它无法完成该操作。很明显,这一定是一个ICollection。我几乎不能改变域名,只是为了适应Fetch

接下来,我看了。未来和。未来价值。由于提供商不支持,因此无法访问

这给我留下了NHibernateUtil.Initialize。作为概念证明,我编写了以下代码:

var leppp = _repository.Query<LogbookEntryProcedure>()
    .Where(lep => lep.LogbookEntry.Id == logbookEntryId);

NHibernateUtil.Initialize(leppp.Select(l => l.Complications));
NHibernateUtil.Initialize(leppp.Select(l => l.Magnitude));
NHibernateUtil.Initialize(leppp.Select(l => l.Outcome));
NHibernateUtil.Initialize(leppp.Select(l => l.FollowUps));

var lepp = leppp.Single();    
var leppp=\u repository.Query()
.其中(lep=>lep.LogbookEntry.Id==logbookEntryId);
初始化(leppp.Select(l=>l.Select));
初始化(leppp.Select(l=>l.magnity));
初始化(leppp.Select(l=>l.output));
初始化(leppp.Select(l=>l.FollowUps));
var lepp=lepp.Single();
它没有抛出异常。然而,它似乎并不急于加载任何内容。当我查看Profiler时,我可以看到相关对象正在往返于数据库

那么,在这种情况下,如何在NHibernate中进行即时加载呢?

如我在文章中所述,切换到即时加载可能不是一个好的举措。现在回到你的问题主题

关于
Fetch
:我不知道这样的限制。您是否尝试过使用
FetchMany
?你能提供准确的错误信息吗?您使用的是旧的NHibernate版本吗

Future
FutureValue
不受支持:嗯,您使用哪个版本的NHibernate?它在那里:,在NHibernate v3中完成。(当前版本为v4.1.1..Net Framework 4必需,如果您的应用程序不针对它,请升级到v3。请注意,Linq提供程序不再是一个外部依赖项,因为v3是嵌入式的,只需使用NHibernate.Linq;)创建一个

NHibernateUtil.Initialize
:它不用于
IQueryable
。这样做只是一个否定操作。
Initialize
检查提供的对象是实体代理还是集合代理,如果是,则对其进行初始化。否则它什么也不做,因为这可能是一个集合或实体,直接加载而不首先进行代理。查询项不是代理。
(这再次强化了我的信念,您应该阅读更多关于NHibernate如何处理延迟加载的内容,因为此实用程序方法是为代理使用而记录的,并且代理用于延迟加载。特别是check,它确实是“批处理延迟加载”。)

因此,如果您在使用旧版本的NHibernate(
升级NHibernate、更改域模型或更改查询API。

“他们似乎并不急于在任何地方加载”:是的,这是NHibernate的常见做法。甚至包括。正确设置的NHibernate应用程序不会因延迟加载而出现N+1问题。它的代码基础更轻,甚至可以在运行时性能上执行即时加载。请按照前面的链接阅读更多内容。谢谢。我会回去做更多的实验。我会阅读你提供的链接。干杯