nhibernate - nHibernate 是否需要延迟加载?

标签 nhibernate lazy-loading

我花了很长时间,但我终于让 nHibernate 的 Hello World 工作了。在我做了“延迟加载”之后它起作用了。老实说,我无法告诉您为什么这一切都有效,但确实如此,现在我正在阅读您不需要延迟加载。是否有一个 hello world 可以让 nHibernate 正常工作?你必须有延迟加载吗?我问是因为我想使用 nHibernate,但我需要了解事情是如何工作的。

谢谢你。

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

使用延迟加载更好吗?

编辑:我正在使用 asp.net 3.5。网络应用项目。

最佳答案

我不明白“我做了延迟加载”是什么意思。延迟加载是一项功能,默认情况下是开启的,如果您不喜欢可以关闭它。

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

鉴于此实体:

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 类的所有成员 virtual。 NHibernate 将创建一个所谓的代理。代理是在运行时定义的类,它派生自 User。您的代码正在以用户身份访问它,并且不知道它是一个子类。但是当您第一次访问它的一个成员时,属性是从数据库加载的。

如果要关闭 User 类的延迟加载,则需要在其映射中执行此操作:
<class name="User" lazy="false"> ...

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

评论列表懒加载

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

如果你想关闭列表中的延迟加载,你在Entity的映射中这样做:
<class name="Entity">
    <bag name="MyComments" lazy="false" >
        ...

通常,延迟加载是一件好事,您的应用程序不必太在意。但也存在一些风险。例如,如果您序列化一个实例,并且它是一个代理,您将得到一个未初始化的代理,而不是任何有用的东西。延迟加载仅在 session 打开时才有效。使用延迟加载并不总是更快。如果您无论如何都需要加载所有数据,那么将其一次性加载会更快。

所以配置需要慎重。

编辑:

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

我认为,只有小而微不足道的应用程序才不需要延迟加载。如果您的系统有许多持久类,则需要延迟加载。

关于nhibernate - nHibernate 是否需要延迟加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/769227/

相关文章:

c# - Entity Framework 中的自定义显式加载 - 有什么办法吗?

c# - NHibernate.断言失败 : null identifier

c# - NHibernate - 流式传输大型结果集?

Angular - 延迟加载谷歌地图 - "You have included the Google Maps JavaScript API multiple..."

swift - 使用参数以编程方式创建 TableView - swift

android - 处理 LazyList 问题

nhibernate - 你能解释 GeneratedBy.HiLo(...) 的参数是什么吗?

c# - Nhibernate Linq - 选择评分最高的项目

nhibernate - Count=n 的此 SqlParameterCollection 的索引 n 无效

java - JUnit hibernate : testing lazy associations fetched