NHibernate-延迟加载集合-不工作
我要么误解了NHibernate手册,要么我做错了什么。有人能帮忙吗 我正在尝试检索没有AuditLogentry的用户。 但NHibernate仍在加载AuditLogentry。我只希望在访问属性时加载AuditLogEntryNHibernate-延迟加载集合-不工作,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
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);
}