NHibernate - 懒惰加载集合 - 无法正常工作

时间:2009-09-09 16:33:21

标签: nhibernate lazy-loading

我要么误解了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集合,但这不是正在发生的事情。

任何想法? 感谢。

1 个答案:

答案 0 :(得分:3)

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

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

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