是否需要延迟加载nHibernate?

joh*_*nny 6 nhibernate lazy-loading

我花了很长时间,但终于让nHibernate的Hello World工作了.在我做了"延迟加载"后,它工作了.老实说,我不能告诉你为什么一切都有效,但确实如此,现在我正在读你不需要延迟加载.是否有一个你好的世界,任何人都有这个让nHibernate工作的骨干?你有懒加载吗?我问,因为我想使用nHibernate,但我需要了解事情是如何工作的.

谢谢.

你知道一个没有这么多开销的你好世界吗?

使用延迟加载更好吗?

编辑:我使用的是asp.net 3.5.Web应用程序项目.

Ste*_*ger 22

我不明白你的意思是"我做了懒加载".延迟加载是一项功能,默认情况下处于启用状态,如果您不喜欢它,可以将其关闭.

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

鉴于此实体:

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; }
}
Run Code Online (Sandbox Code Playgroud)

延迟加载对User的引用

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

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

<class name="User" lazy="false"> ...
Run Code Online (Sandbox Code Playgroud)

然后NHibernate总是创建User类型的实例,没有代理.您不需要虚拟任何东西.

延迟加载评论列表

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

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

<class name="Entity">
    <bag name="MyComments" lazy="false" >
        ...
Run Code Online (Sandbox Code Playgroud)

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

所以配置需要仔细完成.


编辑:

回答你原来的问题:NHibernate需要延迟加载吗?不.但是:我的申请是否需要延迟加载?很可能是的.

我认为,只有小而简单的应用程序不需要延迟加载.如果您的系统具有许多持久化类,则需要延迟加载.


Jef*_* Mc 7

如果您使用的hbm.xml文件映射你只需添加一个lazy="false"<class>元素将让你无延迟加载所有简单的属性.外部实体默认仍然是懒惰的.使他们渴望添加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>
Run Code Online (Sandbox Code Playgroud)

<configuration>在你的web.config 里面会吐出所有SQL NHibernate生成的文件c:\logs\sql.log