2010-01-13 81 views
1

我的Object1类型的对象包含List Children1属性。 我很想得到这些没有孩子的物体。NHibernate:如何获取没有其子集合的对象?

好像detachedCriteria.SetFetchMode(“Children1”,FetchMode.Lazy)应该是一回事, 但显然它不是:( 我尝试使用(新SessionScope()),并设置为null,.Children1获取数据但没有成功(数据已经获取)。

任何想法,将不胜感激。

+0

问了几天后,我“解决了”问题,但忘了在这里写下来。我设置了criteria.SetFetchMode(“Children1”,FetchMode.Eager) 2)当我想要懒惰行为时,我设置了criteria.SetFetchMode(“Children1” ,FetchMode.Lazy),然后我FindAll(条件)我的对象我设置null为Children1列表属性。 我不确定所有这些技巧都是必要的,但我不在乎了。 – wysek 2010-02-23 11:20:34

回答

0

当你映射集合,你指定不使用延迟加载?试着在这一点上,指定延迟加载

+0

我没有指定任何东西,所以默认值适用,但我不知道什么是默认值。 顺便说一句,问题是“解决”。我会在几分钟内添加评论。 – wysek 2010-02-23 11:14:18

0

我们在当前的解决方案中遇到同样的问题d设置懒惰的映射不起作用。我们必须将default-lazy设置为true,并突然使用。

如果所有的关系在默认情况下都应该是懒惰的,这将会最好。

+0

好的,我已经在HasMany属性上设置了Lazy = true,现在它工作, ,但在其他(更频繁)使用情况下,我需要急切加载... 我宁愿有急切的加载默认和懒需求, ,但如果这太复杂了...我会尝试修复那些其他用例(现在我得到LazyInitializationException ...未能懒惰地初始化角色集合...没有会话或会话被关闭) – wysek 2010-01-13 13:08:12

+0

你会得到这个例外,因为你的会话已经关闭,就像消息所说的那样。您需要将您的会话注入到repository/dataaccess类中,并从外部控制会话生存期。 您希望会话持续整个请求生命周期,特别是如果您有延迟加载。 我们在我们的mvc控制器上使用了UnitOfWork属性来启动和关闭一个会话,如果抛出任何nhibernate异常,它就会停止并且会话被回滚 – Henning 2010-01-13 13:30:44

0

当使用的ICriteria API来获取你的实体,您可以指定(覆盖)必须被用于协会fetchmode:

ICriteria crit = session.CreateCriteria (typeof(MyEntity)); 
crit.SetFetchMode ("someAssociationPath", FetchMode.Lazy); 
+0

我试过了。你真的读过我的问题吗? ;) 顺便说一句,问题是“解决”。我会在几分钟内添加评论。 – wysek 2010-02-23 11:12:01

0

在我看来,您正在使用一对一一个映射。在这种情况下,延迟加载不会按设计工作。如果是这样,请检查this article。否则,请提供更多的代码和映射。

+0

为什么你认为你是一对一的映射?当Object1有列表我认为很明显它至少是一对多的。 顺便说一句,问题是“解决”。我会在几分钟内添加评论。 – wysek 2010-02-23 11:13:43

+0

@wysek,你没有提供任何代码,所以我只是从我的角度出发考虑了最可能的原因。对不起,我不太在意读书。 – zihotki 2010-02-23 14:41:18