Nhibernate懒散加载集不工作

Nhibernate懒散加载集不工作,nhibernate,collections,lazy-loading,Nhibernate,Collections,Lazy Loading,我正在使用nhibernate2.1作为spring.NET1.3的一部分。我将以下声明作为映射的一部分。我的理解是,除非调用getter,否则不应加载此对象。我在setter上设置了一个断点,并将所有nhibernate SQL语句转储到记录器。在我测试的一部分中,我实际上已经在我的原始对象上创建了一个全新的子对象和一个全新的属性(因此名称上有“2”),因此我确信该属性在任何地方都不会被访问。尽管如此,只要加载父对象,我就可以验证是否加载了此属性。那么…我在这里错过了什么 <set na

我正在使用nhibernate2.1作为spring.NET1.3的一部分。我将以下声明作为映射的一部分。我的理解是,除非调用getter,否则不应加载此对象。我在setter上设置了一个断点,并将所有nhibernate SQL语句转储到记录器。在我测试的一部分中,我实际上已经在我的原始对象上创建了一个全新的子对象和一个全新的属性(因此名称上有“2”),因此我确信该属性在任何地方都不会被访问。尽管如此,只要加载父对象,我就可以验证是否加载了此属性。那么…我在这里错过了什么

<set name="UserCustomer2" lazy="true">
    <key column="[FK_USERS]" />
    <one-to-many class="UserCustomer2" />
</set>

@多乔,你引导我走上了正确的道路。我测试了很多场景,根据断点和记录的SQL语句,我确定设置断点不会触发延迟加载。但是,当您在调试模式下将鼠标悬停在属性上以对其进行检查时,它实际上会删除对象。我想这有点道理,但我假设当我检查对象时,我只会看到一个代理对象,而不是完全水合的对象。我很惊讶调试模式操作会触发延迟加载——我假设这只会从实际应用程序代码触发。我好奇的另一件事是,setter是否总是被调用,并且只是传递了一个代理对象,或者它是否只是因为我在setter中放置了一个断点才被调用。我会假设前者,但到目前为止我的假设是错误的。如果有人能提供一些见解,我很好奇这在幕后究竟是如何工作的。

您如何验证加载的对象?您确定没有使用测试代码或调试器等加载它吗?我在日志中看到执行的SQL语句,并在setter上放置了一个断点。当我执行时,断点被命中,当我将鼠标悬停在setter中的“value”上时,它是一个完全填充的对象,具有来自数据库的正确数据。您能否说明如何在DB中查询父对象以及UserCustomer2属性在父类中的外观?当然可以;我已经更新了我的原始帖子如果你忽略了断点,你还在日志中看到第二个查询吗?可能调试器正在预加载它…另一件要检查的事情可能是删除私有备份字段,或者通过
access=“field.camelacse下划线”
告诉NH有关它的信息。你的方式可能是和代理对象搞砸了?只是一个猜测。。。
private ICollection<UserCustomer2> _UserCustomer2 = new HashSet<UserCustomer2>();
public virtual ICollection<UserCustomer2> UserCustomer2
{
    get { return _UserCustomer2; }
    set { this._UserCustomer2 = value; }
}
IQuery query = dao.GetQuery("FROM UserImpl u WHERE u.UserName = :username AND u.Password = :password");
query.SetParameter("username", username);
query.SetParameter("password", password);
IList users = query.List();