NHibernate-延迟加载集合-不工作

NHibernate-延迟加载集合-不工作,nhibernate,lazy-loading,Nhibernate,Lazy Loading,我要么误解了NHibernate手册,要么我做错了什么。有人能帮忙吗 我正在尝试检索没有AuditLogentry的用户。 但NHibernate仍在加载AuditLogentry。我只希望在访问属性时加载AuditLogEntry public class User { public virtual int UserId { get; set; } public virtual string UserName { get; set; } public virtual I

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

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

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; }
}
公共类用户
{
公共虚拟int用户标识{get;set;}
公共虚拟字符串用户名{get;set;}
公共虚拟IList AuditLogEntrys{get;set;}
}
公共类AuditLogEntry
{
公共虚拟整数Id{get;set;}
公共虚拟日期时间日期读取{get;set;}
公共虚拟字符串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>


获取用户的代码:

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

      return GetByCriteria(criteria);
  }
public IList GetUserByUserName(字符串用户名)
{
ICriteria criteria=NHibernateSession.CreateCriteria(用户类型))
.Add(Expression.Eq(“UserName”,UserName));
返回GetByCriteria(criteria);
}
现在我期望一个用户对象包含一个空的AuditLogEntry集合,但实际情况并非如此

有什么想法吗??
谢谢。

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

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


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

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

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


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

如何检查AuditLogEntry集合?您是在调试器中检查它,还是通过SQL Profiler进行监视?我可以看到集合已在调试器中填充。您如何检查AuditLogEntrys集合?你是在调试器中检查它还是在通过SQL Profiler进行监视?我可以看到集合在调试器中填充了。你不是先得到一个惰性集合吗?当访问它时,它会去获取条目吗?Andy,这对我来说是有意义的。那么,为什么在检查用户对象的AuditLogEntrys属性时可以看到数据呢?是因为Nhibernate当时正在填充它吗?忽略最后的评论。我只是自己检查了一下,在SQL Profiler中看到第一个查询只获取用户。当我检查AuditLogEntrys属性的值时,会执行另一个查询。谢谢你的解释。难道你不会先得到一个懒散的收藏,当它被访问时,它会去获取条目吗?安迪,这对我来说有点道理。那么,为什么在检查用户对象的AuditLogEntrys属性时可以看到数据呢?是因为Nhibernate当时正在填充它吗?忽略最后的评论。我只是自己检查了一下,在SQL Profiler中看到第一个查询只获取用户。当我检查AuditLogEntrys属性的值时,会执行另一个查询。谢谢你的解释。
  public IList<User> GetUserByUserName(string userName)
  {
      ICriteria criteria = NHibernateSession.CreateCriteria(typeof(User))
          .Add(Expression.Eq("UserName", userName));

      return GetByCriteria(criteria);
  }