2011-05-22 91 views
3

我在EntityA和EntityB之間有一個雙向的多對多關聯,我使用關聯類EntityABLink,對此進行建模是因爲還有其他關於我需要跟蹤的關係的屬性。另外,我還有另一個類,它提供了EntityA和EntityB之間的特定關係,因此我將關聯類視爲一個完整的實體。使用關聯類的雙向多對多關聯的流利NHibernate映射

在EntityA我有一個只讀的屬性,返回一個關聯的EntityB對象的列表,同樣,在EntityB我有一個只讀的屬性,返回一個關聯的EntityA對象的列表。請注意,對於這些屬性,我隱藏了關聯通過關聯類實現的事實。 (我也有更新隱藏實現的關係的專用方法。)在EntityA和EntityB的幕後,我有EntityABLink類型的私有集合。

因爲一張圖片勝過千言萬語,這裏是我迄今所描述的:
enter image description here

(再次提醒市民,上只讀EntityA和EntityB屬性不相同類型的作爲支持它們的私人成員)。

到目前爲止,這麼好。現在我想使用Fluent NHibernate自動映射覆蓋將這些對象保存到數據庫中。當涉及到映射時,我喜歡使用這個功能等效的表示法來考慮上述問題:
enter image description here 從這張圖中可以清楚地看出,我需要的是兩個雙向一對多關係。

在映射上,我想,我需要這樣的:

在EntityA自動映射覆蓋:

mapping.HasMany<EntityABLink>(Reveal.Member<EntityA>(「_AssociationList」)).Inverse().AsBag().Cascade.SaveUpdate(); 
mapping.IgnoreProperty(x => x.EntityBList); 

在EntityB自動映射覆蓋:

mapping.HasMany<EntityABLink>(Reveal.Member<EntityB>(「_AssociationList」)).Inverse().AsBag().Cascade.SaveUpdate(); 
mapping.IgnoreProperty(x => x.EntityAList); 

在EntityABLink自動映射覆蓋:

mapping.References<EntityA>(x => x.EntityA).Not.Nullable(); 
mapping.References<EntityB>(x => x.EntityB).Not.Nullable(); 

但是,當我嘗試此操作時,出現以下錯誤:

「無法在類'EntityB'中爲屬性'_ AssociationList'找到getter。」

我的映射必須有問題,但我不確定是什麼。有任何想法嗎?

+0

順便說一下,上面的錯誤消息看起來不正確,因爲類「EntityB」中的「_AssociationList」不是屬性。這是一個領域,所以它不應該有一個getter。這可能是流利NHibernate的一個問題。我目前使用NHibernate版本2.1.2.4000的FNH版本1.1.0.685。 – MylesRip 2011-05-24 14:53:15

+0

我試圖切換到針對NH 2.1的FNH的最新版本。這是FNH的1.2.0.712版本。我現在得到一個新的,不正確的錯誤消息,說一些其他「實體」沒有映射Id。它所抱怨的「實體」根本不是一個實體 - 它是一個枚舉!在我切換到這個新版本的FNH之前,我已經導出了映射。據我所知,他們看起來對我很正確。使用新版本,根本沒有創建映射,所以沒有什麼可檢查的。我現在確信我正在處理FNH中的一個錯誤。 – MylesRip 2011-05-24 16:28:57

+0

+1爲您的圖表進行徹底解釋。很有幫助。 – 2011-11-14 16:50:13

回答

1

我現在開始工作了。所以這就是訣竅......我回到了Fluent NHibernate 1.1版(特別是1.1.0.685)。然後,雖然使用「Reveal.Member」的映射示例沒有顯示它是必要的,但我在「EntityA._AssociationList」和「EntityB._AssociationList」的映射中添加了「Access.Field()」。這裏是工作映射。

在EntityA自動映射覆蓋:

mapping.HasMany<EntityABLink>(Reveal.Member<EntityA>(「_AssociationList」)).Inverse().AsBag().Cascade.SaveUpdate().Access.Field(); 
mapping.IgnoreProperty(x => x.EntityBList); 

在EntityB自動映射覆蓋:

mapping.HasMany<EntityABLink>(Reveal.Member<EntityB>(「_AssociationList」)).Inverse().AsBag().Cascade.SaveUpdate().Access.Field(); 
mapping.IgnoreProperty(x => x.EntityAList); 

在EntityABLink自動映射覆蓋:

mapping.References<EntityA>(x => x.EntityA).Not.Nullable(); 
mapping.References<EntityB>(x => x.EntityB).Not.Nullable(); 

一旦在FNH 1.1工作,我試着升級到FNH 1.2。 不行。我試過1.2.0.694以及1.2.0.712,這兩個仍然給不正確的錯誤消息,一個不同的「實體」(實際上是一個枚舉!)沒有一個Id映射。

流利的NHibernate是一個很棒的工具,所以我希望最新版本的bug能夠得到修復。 :-)