2010-04-29 61 views
1

假設我有這樣的關係:鑑別基礎上加入了財產

abstract class Base { int Id; int JoinedId; ... } 
class Joined { int Id; int Discriminator; ... } 
class Sub1 : Base { ... } 
class Sub2 : Base { ... } 

以下表格:

table Base (Id int, JoinedId int, ...) 
table Joined (Id int, Discriminator int, ...) 

我想建立一個表,每個層次結構的繼承映射基地,Sub1,Sub2關係,但使用Joined類中的Disciminator屬性作爲鑑別器。

下面是映射文件的總體思路:

<class name="Base" table="Base"> 
    <id name="Id"><generator class="identity"/></id> 

    <discriminator /> <!-- ??? or <join> or <many-to-one>? --> 

    <subclass name="Sub1" discriminator-value="1">...</subclass> 
    <subclass name="Sub2" discriminator-value="2">...</subclass> 
</class> 

有沒有完成這樣的事情與<discriminator><join>,或<many-to-one>的方法嗎? NHiberante似乎認爲鑑別器是給定表格上的一列(這對我來說很有意義..我知道這是非正統的)。

謝謝。

回答

0

簡短的回答是:它不能完成,除非你使用視圖作爲表。

我在當前的項目中遇到了同樣的問題,我必須使用戰略模式解決此問題。

3

難道你不能在Joined上使用子辨識公式嗎?

<discriminator formula="(select j.discriminator from Joined j where j.id = joinedid)"> 
+0

爲我工作!看到我的筆記下面。 – 2011-04-26 21:26:12

2

我一直在尋找同樣的事情,看到迭戈的帖子後,我認爲這是不可能的,並與谷歌搜索試圖找到替代品繼續。但通過反覆試驗發現功能正常的解決方案後,我意識到這是與Meriton公佈的完全相同的解決方案。然而,我所遇到的警告(他所說的但沒有解釋)是,你必須在論壇中完全限定你的領域,你只能返回一個領域,而且你必須將你的公式包含在括號中。如果您將表名稱從字段名稱中刪除,它將假定它是當前查詢的表中的一個字段,並且將以前綴MyTable0_1.這將破壞您的查詢。括號需要將它像嵌套的select語句一樣渲染出來。使用公式將確定您的鑑別器字段的值與您的子類中的鑑別器值進行比較。當我檢查被送到我的SQL我發現,它實際上給了我這個...(請注意我的鑑別場是唯一標識符)

....WHERE [email protected] and (SELECT ClientTypes.ClientClassId FROM ClientTypes WHERE ClientTypes.TypeId = client0_.TypeId)='f04c03db-d469-4c01-83c5-5a19c0aea264'

希望這會幫助別人解決這個問題。