2012-10-19 57 views
3

我升級形式NHibernate的3.2 NHibernate的3.3,我在我的領域類中定義一個像這樣的很多虛擬成員:爲什麼nhibernate 3.3不允許在ICollection上使用private setter?

public virtual ICollection<Movie> Movies { get; private set; } 

該停止了升級後的工作,我得到這個異常:

Following types may not be used as proxies: 
ClassName: method set_Movies should be 'public/protected virtual' or 'protected internal virtual' 

現在我設法通過將setter更改爲protected來解決問題,但我也驚訝於將Collection屬性更改爲僅支持readonly的技巧。

所以我有兩個問題:

  1. 爲什麼NHibernate的決定禁止使用私人setter方法呢?它看起來不像從.net中的技術限制,因爲它之前被支持,我不應該從設計的角度來做,因爲我們應該使用Collection Remove(),Add()等方法來操作但爲什麼允許受保護的公共設置者呢?

  2. 爲什麼(以及如何)使用readonly屬性和後臺工作?

回答

6

NHibernate將代理生成器集成到它的程序集中(糾正我,如果我錯了)所使用的實現無法處理私有setter。

但是,如果沒有setter,它會嘗試搜索後臺字段(因爲否則它無法設置它),只讀是編譯時功能,在使用反射時會被忽略。

+0

謝謝Firo ..你有一個想法之前他們使用什麼,他們現在使用什麼? – kabaros

+0

Fluent-NHibernates defalut是城堡動態代理,集成(與ILmerge)是LinFu動態代理。但我不知道爲什麼林福有這種限制/設計選擇。你仍然可以使用城堡與NHibernates適配器,但它不再支持 – Firo

+0

thx @DiegoMijelshon有用的信息。 – Firo

相關問題