2010-04-29 33 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'

希望这会帮助别人解决这个问题。