我的Object1类型的对象包含List Children1属性。 我很想得到这些没有孩子的物体。NHibernate:如何获取没有其子集合的对象?
好像detachedCriteria.SetFetchMode(“Children1”,FetchMode.Lazy)应该是一回事, 但显然它不是:( 我尝试使用(新SessionScope()),并设置为null,.Children1获取数据但没有成功(数据已经获取)。
任何想法,将不胜感激。
我的Object1类型的对象包含List Children1属性。 我很想得到这些没有孩子的物体。NHibernate:如何获取没有其子集合的对象?
好像detachedCriteria.SetFetchMode(“Children1”,FetchMode.Lazy)应该是一回事, 但显然它不是:( 我尝试使用(新SessionScope()),并设置为null,.Children1获取数据但没有成功(数据已经获取)。
任何想法,将不胜感激。
当你映射集合,你指定不使用延迟加载?试着在这一点上,指定延迟加载
我没有指定任何东西,所以默认值适用,但我不知道什么是默认值。 顺便说一句,问题是“解决”。我会在几分钟内添加评论。 – wysek 2010-02-23 11:14:18
我们在当前的解决方案中遇到同样的问题d设置懒惰的映射不起作用。我们必须将default-lazy设置为true,并突然使用。
如果所有的关系在默认情况下都应该是懒惰的,这将会最好。
好的,我已经在HasMany属性上设置了Lazy = true,现在它工作, ,但在其他(更频繁)使用情况下,我需要急切加载... 我宁愿有急切的加载默认和懒需求, ,但如果这太复杂了...我会尝试修复那些其他用例(现在我得到LazyInitializationException ...未能懒惰地初始化角色集合...没有会话或会话被关闭) – wysek 2010-01-13 13:08:12
你会得到这个例外,因为你的会话已经关闭,就像消息所说的那样。您需要将您的会话注入到repository/dataaccess类中,并从外部控制会话生存期。 您希望会话持续整个请求生命周期,特别是如果您有延迟加载。 我们在我们的mvc控制器上使用了UnitOfWork属性来启动和关闭一个会话,如果抛出任何nhibernate异常,它就会停止并且会话被回滚 – Henning 2010-01-13 13:30:44
当使用的ICriteria API来获取你的实体,您可以指定(覆盖)必须被用于协会fetchmode:
ICriteria crit = session.CreateCriteria (typeof(MyEntity));
crit.SetFetchMode ("someAssociationPath", FetchMode.Lazy);
我试过了。你真的读过我的问题吗? ;) 顺便说一句,问题是“解决”。我会在几分钟内添加评论。 – wysek 2010-02-23 11:12:01
在我看来,您正在使用一对一一个映射。在这种情况下,延迟加载不会按设计工作。如果是这样,请检查this article。否则,请提供更多的代码和映射。
问了几天后,我“解决了”问题,但忘了在这里写下来。我设置了criteria.SetFetchMode(“Children1”,FetchMode.Eager) 2)当我想要懒惰行为时,我设置了criteria.SetFetchMode(“Children1” ,FetchMode.Lazy),然后我FindAll(条件)我的对象我设置null为Children1列表属性。 我不确定所有这些技巧都是必要的,但我不在乎了。 – wysek 2010-02-23 11:20:34