2012-02-07 61 views
1

我正在經歷一些奇怪的事情。我用代碼來修改NHibernate 3.2映射,並且有一個非常簡單的對象模型,我只是用來玩。NHibernate惰性加載但沒有虛擬屬性?

在整個模型中我的屬性都沒有標記爲虛擬的,因爲我不想延遲加載。我通過代碼映射,並在每個類映射我設置Lazy(false);

但是,當涉及到映射集合,如果我嘗試訪問會話後會話結束我得到一個錯誤"failed to lazily initialize a collection of role..."

我必須明確地設置collectionMapping.Lazy(CollectionLazy.NoLazy);,然後纔會急於加載集合。我的理解是,除非您的模型中的屬性是在虛擬中定義的,否則懶加載是不可能的?

我從根本上錯過了什麼嗎?

+0

推薦閱讀:[NHibernate是懶惰的,只是住它](http://ayende.com/blog/4573/nhibernate-is-lazy-just-live-with-it) – 2012-02-08 22:27:12

回答

2

虛擬的屬性和方法。

集合(一個一對多和多對多的多),因爲只有收集很懶,不是集合中的實體不需要任何虛擬財產。 NHibernate將始終使用自己的集合類,即使您禁用延遲加載。

6

virtual需要的不僅僅是延遲加載。 NHibernate要求它們是virtual,因爲它創建了該類的運行時代理並注入行爲。

+0

它是如何雖然它本質上是執行延遲加載時,如果我設置'懶惰(true);'它會告訴我將所有屬性設置爲虛擬? – David 2012-02-07 14:21:23

+1

...但代理僅用於延遲加載。 – 2012-02-07 14:29:32

1

您仍然需要使用IList<T>而不是List<T>,因爲NH需要自己的集合實現。

考慮:

  • 你不會得到很遠沒有延遲加載複雜的模型,除了你的數據庫適合RAM或者你不介意砍你OO模型成碎片從而破壞雙方可維護性和性能。
  • 當您使用接口從中創建代理時,您可以擁有沒有虛擬成員的實體。但是,您應該只使用這些接口來引用實體,因爲它們始終可以是代理。只需要懶協會(多到一個或一個對一個),因爲NHibnerate需要設置代理實體在關聯屬性上
+0

有效點,但是我可以延遲加載,而無需將所有屬性設置爲虛擬。我不認爲這在NHibernate中是可能的。 – David 2012-02-07 15:24:34