【问题标题】:NHibernate - Lazy loading collections - not workingNHibernate - 延迟加载集合 - 不工作
【发布时间】:2009-09-10 00:54:06
【问题描述】:

我要么误解了 NHibernate 手册,要么做错了什么。有人可以帮忙吗?

我正在尝试检索没有 AuditLogEntrys 的用户。 但 NHibernate 仍在加载 AuditLogEntrys。我只希望在访问属性时加载 AuditLogEntrys。

public class User
{
    public virtual int UserId { get; set; }
    public virtual string UserName { get; set; }
    public virtual IList<AuditLogEntry> AuditLogEntrys { get; set; }
}

public class AuditLogEntry
{
    public virtual int Id { get; set; }
    public virtual DateTime DateRead { get; set; }
    public virtual string MachineName { get; set; }
}

映射:

  <class name="Model.User, Model" 
     table="User" 
     lazy="true">
  <id name="UserId" access="property" column="UserID">
    <generator class="native"></generator>
  </id>
  <property name="UserName" access="property" />
  <bag name="AuditLogEntrys" lazy="true" access="property">      
    <key column="UserID" />      
    <one-to-many class="Model.AuditLogEntry, Model"></one-to-many>
  </bag>

  <class name="Model.AuditLogEntry, Model"
     table="AuditLog"
     lazy="true">
    <id name="Id" access="property" column="ID">
      <generator class="native"></generator>
    </id>        
    <property name="DateRead" access="property" column="DateRead"></property>
    <property name="MachineName" access="property" column="MachineName"></property>    
  </class>

获取用户的代码:

  public IList<User> GetUserByUserName(string userName)
  {
      ICriteria criteria = NHibernateSession.CreateCriteria(typeof(User))
          .Add(Expression.Eq("UserName", userName));

      return GetByCriteria(criteria);
  }

现在我希望 User 对象具有空的 AuditLogEntry 集合,但事实并非如此。

有什么想法吗?? 谢谢。

【问题讨论】:

  • 您如何检查您的 AuditLogEntrys 集合?您是在调试器中检查它还是通过 SQL Profiler 观察?
  • 我可以看到该集合已填充到调试器中

标签: nhibernate lazy-loading


【解决方案1】:

通过延迟加载,您将获得一个填充的对象列表,但它们尚未从数据库中“水合”。延迟加载的对象不是您的实体类型,而是“代理对象”,当您访问集合中的项目时,这些对象将填充/填充真实数据。

代理对象的使用是您必须在实体类型中使所有属性虚拟化的原因。代理类型是您的实体类型动态生成的子类,当您访问属性时,它们会实际调用数据库。

希望我理解您的问题,但不同之处在于您得到的是实际对象,而不是空列表。如果您返回一个空列表,则表示数据库中没有引用您的用户的 AuditLogEntry 项。

【讨论】:

  • 你不会先得到一个惰性集合,当访问它时会去获取条目?
  • 安迪,这对我来说有点道理。那么在检查 User 对象的 AuditLogEntrys 属性时,我怎么能看到数据呢?是因为 Nhibernate 正在填充它吗?
  • 忽略最后一条评论。我刚刚检查了自己,并在 SQL Profiler 中看到第一个查询只是获取用户。当我检查 AuditLogEntrys 属性的值时,会执行另一个查询。谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 2011-07-16
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多