2010-04-20 70 views

回答

11

可以使用城堡(除其他外,您可以選擇,也可以使用LinFu,Spring.NET ...)來創建實體的動態代理。

默認情況下,NHibernate使用動態代理來表示你的實體;通過這樣做,當您從數據庫中檢索某個實體時,它將能夠返回一個對象給您,而不會填充所有的屬性。通過使用動態代理,只有在您真正引用屬性後纔會填充實體。
(所以它是一種惰性加載;不要與延遲加載集合/關聯混淆)。

此行爲是爲什麼NHibernate希望你創建每個屬性爲虛擬的默認情況下:NHibernate將創建一個新的類使用這個城堡(或LinFu,...)代理提供程序,從您的實體繼承,它會覆蓋所有屬性,以便它可以「注入」從數據庫中檢索必要數據所需的代碼。

您可以通過在實體映射中指定'lazy = false'來禁用此行爲。 (雖然我認爲即使你禁用了這個功能,NHibernate仍然會要求你使用其中一個代理工廠)。

3

當你從ISession中選擇一個實體時,你並不是真正的實體實例 - 你正在獲取代理對象。 這個代理對象會繼承你的實體並由NHibernate用來跟蹤對這些字段所做的更改。

相關問題