我要么误解了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集合,但这不是正在发生的事情。
任何想法? 感谢。
答案 0 :(得分:3)
使用延迟加载,您将获得一个填充的对象列表,但它们尚未从数据库中“保湿”。延迟加载的对象不是您的实体类型,而是“代理对象”,当您访问集合中的项目时,它们将使用实际数据进行填充/水合。
使用代理对象是您必须在实体类型中虚拟化所有属性的原因。 Proxy类型是您的实体类型的动态生成的子类,当您访问属性时,它们会对数据库进行实际调用。
希望我理解你的问题,但区别在于你得到了实际的对象,而不是空列表。如果您返回一个空列表,则表示在数据库中没有引用您的用户的AuditLogEntry项。