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需要延迟加载吗?不.但是:我的申请是否需要延迟加载?很可能是的.
我认为,只有小而简单的应用程序不需要延迟加载.如果您的系统具有许多持久化类,则需要延迟加载.
如果您使用的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
| 归档时间: |
|
| 查看次数: |
11397 次 |
| 最近记录: |