Nhibernate懒加载一套不工作

时间:2011-10-11 19:33:59

标签: nhibernate collections lazy-loading

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

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

@A:这是我的财产:

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();

1 个答案:

答案 0 :(得分:0)

@dotjoe,你带领我沿着正确的道路走下去。我测试了很多场景,基于断点和记录的SQL语句,我已经确定设置断点不会触发延迟加载。但是,当您将鼠标悬停在属性上以在调试模式下进行检查时,它实际上会对对象进行水合。我猜这种情况有道理,但我在假设当我检查对象时,我只会看到代理对象而不是完全水合的对象。我很惊讶调试模式操作会触发延迟加载 - 我假设只会从实际应用程序代码触发。我很好奇的另一件事是,如果setter总是被调用并且只是传递了一个代理对象,或者只是被称为BECAUSE,我在setter中放了一个断点。我会假设前者,但到目前为止,我的假设是错误的。如果有人能提供一些见解,我很好奇这是如何在幕后实际工作的。