我不明白您所说的“我做了延迟加载”是什么意思。延迟加载是一项功能,默认开启,不喜欢可以关闭。
有两种延迟加载:用于引用其他实体和用于列表。
给定这个实体:
class Entity
{
// pk
int id { get; private set; }
// reference to another entity
User MyUser { get; set; }
// list to other entities
IList<Comments> MyComments { get; set; }
}
延迟加载对 User 的引用
如果对 User 进行延迟加载,则需要定义 User 类的所有成员 virtual。NHibernate 将创建一个所谓的代理。代理是在运行时定义的一个类,它派生自 User。您的代码以用户身份访问它,并且不知道它是一个子类。但是当您第一次访问它的一个成员时,属性是从数据库中加载的。
如果要关闭 User 类的延迟加载,则需要在其映射中执行此操作:
<class name="User" lazy="false"> ...
然后 NHibernate 总是创建用户类型的实例,没有代理。你不需要任何虚拟的东西。
评论列表的延迟加载
如果您在评论列表上使用延迟加载,那么实现延迟加载的是列表本身。如果您第一次访问该列表,它会从数据库中加载。NHibernate 使用实现 IList 的列表,但不是 List。
如果要关闭列表中的延迟加载,请在 Entity 的映射中执行此操作:
<class name="Entity">
<bag name="MyComments" lazy="false" >
...
通常,延迟加载是一件好事,您的应用程序不必太在意它。但也存在一些风险。例如,如果您序列化一个实例,并且它是一个代理,您将得到一个未初始化的代理,而不是任何有用的东西。延迟加载仅在会话打开时才有效。使用延迟加载并不总是更快。如果您无论如何都需要加载所有数据,那么将其加载到一块会更快。
所以配置需要仔细。
编辑:
回答您最初的问题:NHibernate 需要延迟加载吗?不可以。但是:我的应用程序需要延迟加载吗?很可能是的。
我认为,只有小型且相当琐碎的应用程序才不需要延迟加载。如果您有一个包含许多持久类的系统,则需要延迟加载。