2010-12-07 100 views
8

我使用NH 3.0和FNH 1.1与NH3重新编译。NHibernate:无法成功急切加载

我有一个用户模型,我想在加载时总是检索它的配置文件。我使用NH3的linq提供程序,但不能使用它的Fetch方法(因为我的存储库隐藏了NHibernate并返回了IQueryable,并且事实上ToPagedList在查询上被调用,因此阻止我将Fetch作为查询的最后一个调用)。

在用户映射我设置:

HasOne(x => x.Profile) 
    .Not.LazyLoad() 
    .Cascade.All(); 

但设置LazyLoad为OFF没有帮助。我也使用了获取模式。

我的期望是,如果我定义了这个映射,那么我甚至不需要告诉Linq我希望在请求User实体时获取Profile。 Linq应该尊重地图,不是吗?

+1

嗯...我认为1对1总是渴望提取...实际上我记得不能延迟加载1对1。 NH3改变了吗? – dotjoe 2010-12-08 15:31:24

回答

3

我也有这个问题,不幸的是我认为这是由设计。 NHibernate 3.0 Linq提供程序使用HQL,而HQL在这方面不遵守你的映射。举例来说,如果你没有

session.CreateQuery(“从配置文件”)。名单()

你只会得到所有配置文件的列表,甚至如果你的用户类不入你的映射具有outer-join = true。

如果您正在使用所使用的API性判据老NHibernate.Linq提供商,或标准API直接:

session.CreateCriteria()名单()

你会得到返回所有与用户连接的外部配置文件列表,就像您的映射文件请求一样。

现在我不知道为什么HQL支持的linq提供程序不尊重映射(如果有人知道解决此问题的方法,请发布),但我相信这就是为什么你会看到这种行为。