2010-04-20 84 views
1

我使用Fluent NHibernate AutoMappings來映射我的實體,包括一些組件對象。 其中一個組件對象包括像一個屬性如下:如何使用Fluent Nhibernate的AutoPersistenceModel忽略組件的屬性?

public string Value 
{ 
    set _value = value; 
} 

這導致NHibernate.PropertyNotFoundException:「找不到屬性‘值’......一個getter」

我想忽略這個性質。

我試着爲組件類創建一個IAutoMappingOverride,但出於同樣的原因,我無法使用AutoMapping> .IgnoreProperty(x => x.Value)。 「屬性或索引器'MyComponent.Value'不能用於此上下文,因爲它缺少get訪問器」我也查看了IComponentConvention,但無法看到使用此約定更改映射。

任何幫助,將不勝感激......

感謝

回答

1

您可以使用:

Reveal.Member<Owner, object> ("Value")`. 

mapping.IgnoreProperty(Reveal.Member<Owner, object> ("Value") 

Reveal.Member可以在任何地方使用連貫NHibernate預期的表現。這可以用來顯示私有/受保護的屬性和字段。

+0

感謝您的提示Chris。幸運的是,該模型已經演變,因此我不再需要只寫屬性。當我有機會時,我會測試你的答案。 – 2011-11-15 16:40:57

+0

謝謝克里斯,這工作得很好。但有幾點:1 - IgnoreProperty期望Reveal.Member (「Value」) - 不是字符串; 2 - 它仍然需要一個私人獲取訪問者的財產。 – 2012-02-22 10:11:36

+0

所以它是,更正 – 2012-02-22 11:27:34

0

你也許能夠得到覆蓋,如果你添加一個私有Get方法你的財產的工作。

0

我已經嘗試了一個私有和受保護的獲取存取器,但覆蓋不會編譯除非訪問器是公共的。

「屬性或索引不能在這種情況下使用,因爲它缺少get訪問」

+0

其他人有私人支持變量和FNH的麻煩 - 我不會使用它們,除非我真的很需要它們。我建議你嘗試將該屬性聲明爲「公共虛擬字符串值{get; set;}」以獲得覆蓋工作,然後嘗試使「get」變爲private(我知道你可以使「set」變爲private,但是不確定「得到」)。 – 2010-04-21 22:40:39

0

您可以添加公有的getter拋出NotSupportedException,使編譯器高興:

public virtual string Value 
{ 
    get { throw new NotSupportedException(); } 
    set { _value = value; } 
} 
+0

不幸的是,這似乎是最好的選擇。 – 2011-05-10 13:53:32

+0

Chris Chilvers回答,使用Reveal.Member (「PropertyName」)忽略該屬性,給出所需的結果。沒有更多不必要的NotSupportedException! – 2012-02-22 10:05:09

+0

'Reveal'不是IntelliSense-friendly – 2012-02-24 08:32:01

1

您可以使用OverrideAll( )在你的映射文件中。如果您不知道它將是其成員的類型,那麼您需要使用此版本將成員指定爲字符串。以下是Fluent Nhibernate Wiki的示例。

.OverrideAll(map => 
{ 
    map.IgnoreProperty("YourProperty"); 
});