2011-05-24 35 views
5

它曾經有可能用NHibernate映射私有設置器的自動屬性,但從版本3.2開始,這不再是這種情況(不是沒有替換實體驗證器),請參閱NH dev discussion爲什麼NHibernate需要「保護內部」的自動屬性的可見性?

我明白protected的要求,但爲什麼internal?這打破封裝,只是覺得骯髒。

回到背景字段是唯一的選擇嗎?

UPDATE:尷尬,但是真實的,事實證明internal不是必需的。所以,這是回退到支持領域或使用受保護的setter,或者避免在構造函數或facing the risk of hard to track bugs中設置值之間的折騰。謝謝Fabio和@Nexus指出我的錯誤。

+0

您的意思是: 「爲什麼'virtual'」,而不是 「爲什麼'internal'」? – 2011-05-24 18:12:18

+0

不,我的意思是爲什麼'protected internal'而不是'protected',如果我不能'private'。 – 2011-05-24 18:21:09

+0

好吧,我被原標題誤導了...... – 2011-05-24 18:23:10

回答

6

邁克爾,

public string Foo { get; protected set; }應該還是可以的,dev的討論是關於public string Foo { get; private set; }同時使用懶惰特性,這可能會導致錯誤。

+0

代理驗證器使用MethodBase.IsFamilyOrAssembly,所以內部OR保護應該可以工作,但我不認爲它同時需要。 – Danielg 2011-05-25 14:42:40

+0

我很確定我測試了這一點,但如果你是對的,那會是一些臉上的蛋。結果有點兒。 – 2011-05-25 15:55:45

+0

經過測試,並用結果更新了問題(您是對的,謝謝!) – 2011-05-25 16:44:06

1

NHibernate很髒。它使用反射來訪問屬性和字段。

您甚至可以將private屬性和字段映射爲數據點。

NHibernate完全忽略了它需要訪問的元素的可見性。

+0

Paulo,你會如何將它與NH 3.2進行映射:'public string Foo {get;私人設置; ''? – 2011-05-24 18:10:59

+0

我完全不記得查詢屬性的getter和setter的NHbiernate的代碼。它可以完成,但我不確定。 – 2011-05-24 18:12:49

1
public class Class{ 

    public string Foo { get; private set; } 

} 

Property(class=> class.Foo); 

然後,您將需要關閉代理驗證您的配置:

Config.Proxy(p => {p.Validation = false});

相關問題