2013-10-01 77 views
2

考慮以下NHibernate映射,並注意註釋的屬性。這些列與map中指定的keyindex列相同。當我刪除註釋(因此包括屬性的TypeOfPartUnitId列)時,我得到「重複列映射收集」異常。NHibernate「重複列映射收集」異常

<map name="Parts" table="ActiveUnitParts" lazy="false"> 
    <key column="UnitId" /> 
    <index column="TypeOfPart" type="integer"/> 
    <composite-element class="ActiveUnitPart"> 
    <property name="Id" /> 
    <property name="CreationDate" /> 
    <property name="PartInfo"/> 
    <property name="Remarks"/> 
    <!-- <property name="TypeOfPart" /> --> 
    <!-- <property name="UnitId" /> --> 
    </composite-element> 
</map> 

我需要的代碼是Dictinonary<TypeOfpart, ActiveUnitPart>。但是我遇到的問題是Dictinonary<TypeOfpart, ActiveUnitPart>中的ActiveUnitPart實例中未設置屬性UnitIdTypeOfPart的值。

是的,這個單元的相關部分的列表被加載,並且是字典中的鍵與右部分相關。但我不明白爲什麼我不能引用TypeOfPartUnitId來填充ActiveUnitPart本身的屬性。

我該如何解決或解決方法?

爲什麼我需要這個

動機: 我必須能夠與ActiveUnitPart s到工作,而無需引用相關UnitUnitId

編輯1: 我知道我可以攔截Parts setter方法的Unit並遍歷Dictinonary<TypeOfpart, ActiveUnitPart>來設置代碼中的值,但它看起來像是hack,我希望學習更優雅的NHibernate完成它的方法,如果可能的話。

回答

3

有可能,只需將column的映射更改爲formula即可。如何實現這一點的最佳方式是:

<property name="TypeOfPart" formula="TypeOfPart" insert="false" update="false" /> 
<property name="UnitId" formula="UnitId" insert="false" update="false" />