我有一个遗留数据库,我使用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案例,即使从未引用过帐户,也会加载每个帐户.当多对一映射为惰性代理时,为什么所有帐户都被加载?
该问题是由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/