当前位置:  开发笔记 > 编程语言 > 正文

使用property-ref映射到非键字段时,延迟加载不适用于多对一关系

如何解决《使用property-ref映射到非键字段时,延迟加载不适用于多对一关系》经验,为你挑选了1个好方法。

我有一个遗留数据库,我使用NHibernate进行映射.关注的对象是帐户和通知对象列表.对象看起来像:

public class Notification
{
    public virtual int Id { get; set; }
    public virtual DateTime BatchDate { get; set; }
    /* other properties */

    public virtual Account Account { get; set; }
}

public class Account 
{
    public virtual int Id { get; set; }
    public virtual string AccountNumber { get; set; }
    /* other properties */ 
}

映射文件如下所示:



    


    



    
        
    
    
    

但是,当我创建一个标准,如

return session.CreateCriteria(typeof(Notification)).List();

我得到一个Select N + 1案例,即使从未引用过帐户,也会加载每个帐户.当多对一映射为惰性代理时,为什么所有帐户都被加载?



1> iammichael..:

该问题是由property-ref属性引起的.延迟加载仅在many-to-one引用使用另一个对象的主键时起作用,因为NHibernate假定有一个外键约束强制执行此类值的有效性.使用非主键(由property-ref表示),NHibernate不做出这个假设,因此不假设相关对象必须存在.由于它不想为不存在的对象创建代理(即应该为null而不是代理),因此它急切地获取远程对象.not-found="ignore"指定时存在同样的问题,因为这表明未强制执行外键关系,并且可能导致空引用.

也可以看看:

NHibernate通过session.Load()创建代理,但不通过Linq或Criteria API创建代理

http://frankmao.com/2007/12/05/lazy-load-conflicts-with-property-ref-in-many-to-one-mapping/

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有