是否可以在NHibernate会话中为所有实体启用/禁用延迟加载?

时间:2009-12-16 08:21:03

标签: nhibernate session lazy-loading

默认情况下,NHibernate延迟加载所有集合,在大多数情况下这对我来说很好。但是,我遇到了一些使用反射的工具的问题,这些工具不能很好地与代理对象一起使用。在这种情况下,我无法使用JSON.NET序列化实体,因为它在遇到代理对象时会抛出异常。

我的问题是,有没有办法告诉会话在该会话的生命周期内禁用所有实体的延迟加载?我知道你可以为特定类型做这件事,但我希望能够为所有实体做到这一点。

3 个答案:

答案 0 :(得分:3)

您可以使用sessionFactory.OpenStatelessSession(),并且您将获得一个IStatelessSession实例,该实例不使用延迟加载。

请注意,IStatelessSession有一个不跟踪更改的简化模型。但是,对你的用例来说似乎已经足够了。

答案 1 :(得分:0)

我认为这是不可能的,因为当构建ISessionFactory时,类和属性变得懒惰(通过配置 - XML或Fluent),并且只在应用程序生命周期的开始时发生一次。在那里,生成实际的代理类并用于处理延迟加载。

我不知道它是否对您有帮助,但您可以获得基础代理的类型(实际实体类型),如下所示:

Type t = entity.GetType().BaseType;

“实体”是您作为代理人的对象。

此外,您可以使用DTO来使用像AutoMapper这样的对象 - 对象映射器来使用JSON.NET而不是实际实体进行序列化来协助您。

答案 2 :(得分:0)

如果您因任何原因不想使用无状态会话,可以急切地提取查询。

<强>标准
.SetFetchMode(“ClassName”,FetchMode.Eager)

<强> HQL

string hql = "from Order o" +
             " inner join fetch o.OrderLines" +
             " inner join fetch o.Customer" +
             " where o.Id=:id";