我正在使用NH3和FNH 1.1重新编译NH3。
我有一个用户模型,我希望在加载时始终检索其配置文件。我使用NH3的linq提供程序但不能使用它的Fetch方法(因为我的存储库隐藏了NHibernate并返回了IQueryable,并且在查询中调用了ToPagedList,因此阻止我将Fetch作为查询的最后一次调用)。
在我设置的UserMap中:
HasOne(x => x.Profile)
.Not.LazyLoad()
.Cascade.All();
但是将LazyLoad设置为OFF并没有帮助。我也玩过fetch模式。
我的期望是,如果我定义了这个映射,那么我甚至不必告诉Linq我希望在请求User实体时获取Profile。 Linq应该尊重映射,不是吗?
答案 0 :(得分:3)
我也有这个问题,不幸的是我认为这是设计上的。 NHibernate 3.0 Linq提供程序使用了HQL,HQL在这方面不尊重您的映射。例如,如果你做了
session.CreateQuery(“来自个人资料”)。列表()
您只会获得所有配置文件的列表,即使您的映射具有outer-join = true,您的用户类也不会加入。
如果您使用的是直接使用Critera API或Criteria API的旧NHibernate.Linq提供程序:
session.CreateCriteria()。表()
您将获得所有与用户连接的外部配置文件的列表,就像您的映射文件请求一样。
现在我不知道为什么HQL支持的linq提供程序不尊重你的映射(如果有人知道解决方法,请发帖),但我相信这就是你看到这种行为的原因。