nHibernate是否需要延迟加载?

nHibernate是否需要延迟加载?,nhibernate,lazy-loading,Nhibernate,Lazy Loading,我花了很长时间,但我终于让nHibernate的Hello World开始工作了。说实话,我不能告诉你为什么它都能工作,但它确实起了作用,现在我读到你不需要延迟加载。有没有一个大家都有的“你好”世界,让nHibernate发挥作用?你必须有延迟加载吗?我这样问是因为我想使用nHibernate,但我需要了解它是如何工作的 多谢各位 你知道一个没有那么多开销的hello world吗 使用延迟加载是否更好 编辑:我正在使用asp.NET3.5。Web应用程序项目。如果您正在使用hbm.xml文件进

我花了很长时间,但我终于让nHibernate的Hello World开始工作了。说实话,我不能告诉你为什么它都能工作,但它确实起了作用,现在我读到你不需要延迟加载。有没有一个大家都有的“你好”世界,让nHibernate发挥作用?你必须有延迟加载吗?我这样问是因为我想使用nHibernate,但我需要了解它是如何工作的

多谢各位

你知道一个没有那么多开销的hello world吗

使用延迟加载是否更好


编辑:我正在使用asp.NET3.5。Web应用程序项目。

如果您正在使用hbm.xml文件进行映射,只需向
元素添加
lazy=“false”
即可获得所有简单属性的非惰性加载。默认情况下,外部实体仍然是懒惰的。为了让他们更急切,将
lazy=“false”
添加到映射元素中。即时加载的一个好处是您不再需要实体类上的虚拟属性

编辑: 如果你真的想知道幕后发生了什么,NHibernate会使用log4net记录所有事情。添加

<configSections>
  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  <!-- Rest of config sections here -->
</configSections>
<log4net>
  <appender name="SQLFileAppender" type="log4net.Appender.RollingFileAppender, log4net">
    <param name="File" value="C:\Logs\SQL.log" />
    <param name="AppendToFile" value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <logger name="NHibernate.SQL" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="SQLFileAppender" />
  </logger>
</log4net>


在您的web.config中的
内部将吐出所有的SQL NHibernate生成的文件
c:\logs\SQL.log

我不明白您所说的“我做了延迟加载”是什么意思。延迟加载是一项功能,它在默认情况下处于打开状态,如果您不喜欢,可以将其关闭

有两种延迟加载:用于对其他实体的引用和用于列表

鉴于该实体:

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; }
}
类实体
{
//主键
int id{get;private set;}
//对另一实体的引用
用户MyUser{get;set;}
//向其他实体提交清单
IList MyComments{get;set;}
}
延迟加载对用户的引用

如果用户上有延迟加载,则需要定义用户类virtual的所有成员。NHibernate将创建一个所谓的代理。代理是在运行时定义的一个类,它派生自用户。您的代码正在以用户身份访问它,并且不知道它是一个子类。但是,当您第一次访问其中一个成员时,将从数据库加载属性

如果要关闭用户类上的延迟加载,则需要在其映射中执行此操作:

<class name="User" lazy="false"> ...
。。。
然后NHibernate总是创建User类型的实例,而不创建代理。你不需要任何虚拟的东西

延迟加载评论列表

如果在注释列表上使用延迟加载,则是列表本身实现了延迟加载。如果您第一次访问该列表,它将从数据库中加载。NHibernate使用实现IList的列表,但不是列表

如果要关闭列表中的延迟加载,请在实体的映射中执行此操作:

<class name="Entity">
    <bag name="MyComments" lazy="false" >
        ...

...
通常,延迟加载是一件好事,您的应用程序不必太在意它。但也有一些风险。例如,如果您序列化了一个实例,并且它是一个代理,那么您将得到一个未初始化的代理,而不是任何有用的代理。延迟加载只在会话打开时起作用。使用延迟加载并不总是更快。如果您仍然需要加载所有数据,那么在一块中加载数据会更快

因此,需要仔细地进行配置


编辑:

回答您最初的问题:NHibernate是否需要延迟加载?否。但是:我的应用程序中是否需要延迟加载?很可能是的


我认为,只有小而琐碎的应用程序不需要延迟加载。如果你有一个有很多持久类的系统,你需要延迟加载。

我的回答中增加了另一个部分。[NH参考文档与
完全矛盾。“因为延迟初始化可能导致错误[…],非延迟是默认的。”
“NHibernate对集合使用惰性选择抓取,对单值关联使用惰性代理抓取。
”-用于collections@Chris:第一句话很旧。Lazy是版本(我不知道)后的默认值。第二句话是我实际试图解释的。