2014-01-22 61 views
3

我對NHibernate很新,我試圖創建一個映射文件來擴展數據模型項目。我映射的特定表在以下圖像中稱爲AttributeDef,列ControlType實際上涉及表中名爲Code的查找(是的,我知道 - 應該有FK約束,但這種情況在此項目中很常見所以請忽略那些明顯的喊話者並專注於這個問題)。在大多數情況下,引用Code的表還包含一個包含來自表CodeSet的ID的列,因爲Code中的鍵幾乎不可避免地是一個組合鍵,但在這種情況下可能並不是因爲原作者認爲「嘿,他們都是來自同一個代碼集,所以有什麼意義?「。Nhibernate映射文件中的硬編碼值

Table structure relating to problem

現在如果有在AttributeDef其中包含的代碼集值的列則映射不會是太大的問題。爲代碼實體的映射是這樣的:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="Activus.DataModel" namespace="Activus.DataModel"> 

    <class name="Code" table="Code" mutable="false"> 

    <composite-id name="CompositeCodeId" class="CompositeCodeId"> 
     <key-property name="CodeId" column="CodeId"/> 
     <key-property name="CodeSet" column="CodeSet"/> 
    </composite-id> 

    <property name="Description" column="Description" type="string" length="100" not-null="true"/> 
    <property name="ExternalRef" column ="ExternalRef" type ="string" length ="256" not-null ="true"/> 
    <property name="InternalRef" column ="InternalRef" type ="string" not-null ="false"/> 
    <many-to-one name="CodeSet" class="CodeSet" column="CodeSet" not-null="true" insert="false" update="false"/> 

    </class> 

</hibernate-mapping> 

因此,如果有對代碼集值(名義上稱爲FormControlCodeSet在這個例子中)在AttributeDef一列,然後在我的AttributeDef映射文件中我將包括

<many-to-one name="ControlType" class="Code" not-null="false"> 
    <column name="ControlType" /> 
    <column name="FormControlCodeSet" /> 
</many-to-one> 

而且一切都會好的。問題是,將該列添加到AttributeDef將是非常有創意的,因爲我將不得不做很多其他更改以適應這種情況,這會增加我正在做出的更改的風險因素, (從客戶的角度考慮他們的時間框架)是不可接受的。

所以,就像它的去思考一個可怕的,可怕的事情,是否有可能替代線

<column name="FormControlCodeSet" /> 

隨着(悄悄話)硬編碼的價值?這個價值在十年內沒有變化,並且很快就不可能實現,但它會讓我們超越這一變化,並強調需要擴大範圍並實施列入額外的列。我認識到這是多麼可怕,但不幸的是,儘管這個數據庫在很多情況下都是鞋子式的,但它並不適合ORM。

回答

2

在與NHiberante合作時,您不必小聲地要求。因爲與傳統DB (即固定DB架構)的合作非常標準,所以NHibernate確實支持許多不同的設置。

其中之一是一對(替代)設置:"column" vs "formula"。第一個需要,因爲它是,第二個可以做,無論我們需要什麼。拿列,列,傳一個常量。所以:

<many-to-one name="ControlType" class="Code" not-null="false"> 
    <column name="ControlType" /> 
    <!-- let's replace this --> 
    <!--<column name="FormControlCodeSet" />--> 

    <!-- 1) with a constant number 123--> 
    <formula>123</formula> 
    <!-- 2) with a constant string 'constantString' --> 
    <formula>'constantString'</formula> 
</many-to-one> 

不知道,如果FormControlCodeSet常數應intstring,但如上圖所示,任一選項是可能的。

+0

完美 - 謝謝!我一直在尋找像'不變'等元素,甚至沒有考慮'公式'。現在我只需要說服我的老闆不得不依賴這些事情是多麼糟糕,我們確實需要改進'關係'部分! –

+0

偉大的,如果這有幫助的話;)享受NHibernate –

+1

它使我想到我可以避免使用常量,現在我有工作使用查詢來代替。花了一段時間,因爲我找不到一個好的解釋,但對於那些遵循的人來說,你的任意SQL語句需要別名,或者NHibernate假定這些列屬於地圖的父表,並將它們別名。我也看到很多人說你不得不用雙引號,而不是這種情況。因此,我結束了(SELECT CodeSet.CodeSet FROM CodeSet WHERE CodeSet.ViewName ='FormControl')它完美的作品。 –