2010-12-02 64 views
6

使用LINQ to Sql,對於給定的提取,您可以指定不希望加載(急切或懶惰地)特定子元素。這在NHibernate中可能嗎?有時候我只想要根對象和/或只是對象圖的一部分,我希望能夠指定它,而不是寫一個DTO,並且做映射只是爲了解決NHibernate感覺的事實如果我嘗試序列化我的對象,則強制加載所有內容。我可以選擇性地關閉延遲加載w/NHibernate嗎?

謝謝!

回答

5

是的,但是......

你在這裏可能取決於你的NHibernate的版本和你如何構建查詢的靈活性水平。例如,LINQ查詢(這裏是版本控制可能有所不同)不會給你與ICriteria或HQL查詢相同的靈活性。

使用標準API,您可以調用.SetFetchMode(),傳遞屬性和該查詢所需的模式。

NHibernate還允許您創建投影,因此您可以在未映射的情況下實例化未映射類型或DTO的對象。當然,投影僅僅是單向的;如果未映射,則不能保留。

+0

這就是我要找的 - 謝謝。我希望根據請求執行此操作,而不是在集合中對其進行硬編碼。 – sydneyos 2010-12-04 00:21:39

2

一切,周杰倫已經說過了,再加上你可以在你的映射文件指定的懶惰......你可以在類級別指定:

<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忽略。