0

我要么误解了 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);
  }

现在我期望一个带有空的 AuditLogEntry 集合的用户对象,但这不是正在发生的事情。

有任何想法吗??谢谢。

4

1 回答 1

3

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

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

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

于 2009-09-09T16:45:01.997 回答