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