NHibernate - 外连接,不懒惰,忽略未找到 - 你如何在一个语句中构建对象?

Posted

技术标签:

【中文标题】NHibernate - 外连接,不懒惰,忽略未找到 - 你如何在一个语句中构建对象?【英文标题】:NHibernate - outer join, not lazy, ignoring not found - how do you build the objects in one statement? 【发布时间】:2011-11-18 15:43:24 【问题描述】:

我已经阅读了很多关于此的帖子,最后一个是声明我正在经历的行为是预期的,如果不是首选的方式。

我有一些域模型映射到他们的数据库表。

我正在使用 Criteria 对象来查询它们。

 var query = session.CreateCriteria(typeof(Posting))
                .CreateAlias("Person", "person", JoinType.InnerJoin).SetFetchMode("Person", FetchMode.Eager)
                .CreateAlias("Location", "location", JoinType.InnerJoin).SetFetchMode("Location", FetchMode.Eager)
                .CreateAlias("Post", "post", JoinType.InnerJoin).SetFetchMode("Post", FetchMode.Eager)
                .CreateAlias("post.Zone", "postzone", JoinType.LeftOuterJoin).SetFetchMode("post.Zone", FetchMode.Select)

它会产生我正在寻找的确切陈述。我希望它能够急切地填充对象(它确实如此)并为关系失败的 post.Zone 留下空值。

在我的映射中,我不得不说 not-found=ignore (Notfound.Ignore() FNH) 由于外连接导致 NH 生成许多子查询 - 全部在 Zone 表上 - 其中对我来说似乎没有必要,尤其是因为它已经拥有填充 Zone 对象所需的数据。

任何人都可以了解我可以对映射或查询/条件进行的任何更改以将负载保持在单个查询中,还是我应该期望外部连接的每条记录都有一个额外的语句?

谢谢, 山姆

【问题讨论】:

【参考方案1】:

不幸的是,not-found=ignore 导致额外选择是一个已知问题。在很长一段时间(2007 年)中,NHibernate 和 Hibernate 都为此提交了错误报告,目前除了删除 not-found=ignore 或更改数据库中存在的数据之外,还没有可用的解决方法,因此它不再需要。

一种可能的解决方法,虽然不是一个很好的解决方法,是让一个存储过程执行您想要的查询,然后从 NHibernate 调用它。这将删除多余的查询。

【讨论】:

真的吗?因此,实际上没有办法从实际保存所需数据的初始查询中填充外部连接实体。根数据转换器(不记得类型名称)做得很好或规范化对象结构,但我能理解为什么无法构建外部连接记录?是否没有另一种一次加载的获取策略? @sambomartin 不幸的是,据我所知,我们在一些旧表中遇到了完全相同的问题,并且迄今为止无法找到解决此问题的任何好方法。 NHibernate 错误报告中的最后一个回复说这一切真的很不幸。

以上是关于NHibernate - 外连接,不懒惰,忽略未找到 - 你如何在一个语句中构建对象?的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate有一个懒惰的负载

保存后懒惰忽略

没有外键的NHibernate映射集合

如何阻止NHibernate阅读儿童收藏?

Fluent NHibernate 忽略 ClassMap 中的属性,使用 FluentMappings

为啥 Fluent NHibernate 会忽略我对组件的唯一约束?