我可以选择性地关闭带有NHibernate的延迟加载吗?

时间:2010-12-02 22:32:32

标签: nhibernate fluent-nhibernate

使用LINQ to Sql,您可以为给定的提取指定您不希望加载特定子元素(急切或懒惰)。这在NHibernate有可能吗?有时我只想要根对象和/或只是对象图的一部分,我希望能够指定而不是必须编写DTO并进行映射以解决NHibernate感觉到的事实如果我尝试序列化我的对象,则必须加载所有内容。

谢谢!

2 个答案:

答案 0 :(得分:5)

是的,但是......

此处的灵活程度可能取决于您的NHibernate版本以及构建查询的方式。例如,LINQ查询(此处版本控制可能会产生影响)不会为您提供与ICriteria或HQL查询相同的灵活性。

使用条件API,您可以调用.SetFetchMode(),传入属性以及该查询所需的模式。

NHibernate还允许您创建投影,因此您可以在不映射的情况下实例化未映射类型或DTO的对象。当然,投影只是单向的;如果没有映射,则无法持久化。

答案 1 :(得分:3)

Jay已经说过的所有内容,加上你可以在你的映射文件中指定懒惰......你可以在类级别指定它:

<class name="Foo" lazy="true">
  <!-- additional data -->

或在物业/收藏层:

<property Name="Bar" lazy="true"/>
<set Name="Bars" lazy="true"> <-- makes the collection lazy
<set Name="Bars" fetch="join"> <-- eagerly fetches child items in the collection
<set Name="Bars" fetch="select"> <-- fetches items via another select when the collection is accessed for the first time

可以为特定查询覆盖这些默认值,并且HQL会忽略这些默认值。