基于联合属性的判别器

时间:2010-04-29 19:16:02

标签: nhibernate nhibernate-mapping

假设我有这种关系:

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, ... )

我想为Base,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似乎认为鉴别器是给定表格上的一列(这对我来说很有意义......我知道这是非正统的)。

感谢。

3 个答案:

答案 0 :(得分:3)

你不能在Joined上使用带有子选择的鉴别器公式吗?

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

答案 1 :(得分:2)

我正在寻找完全相同的东西,在看到迭戈的帖子之后,我认为这是不可能的,继续搜索谷歌试图找到替代品。但在通过反复试验找到一个有效的解决方案后,我意识到这是Meriton上面发布的完全相同的解决方案。然而,我遇到的警告(他解释但未解释)是你必须在论坛中完全限定你的领域,你必须只返回一个领域,你必须在括号中包装你的公式。如果您将表名保留在字段名称之外,它将假定它是查询所针对的当前表上的字段,并将以MyTable0_1.为前缀,这会破坏您的查询。括号需要像嵌套的select语句一样呈现出来。使用公式将确定鉴别器字段的值,以与子类中的鉴别器值进行比较。当我检查我的SQL被发送时,我发现它基本上给了我这个...(注意我的鉴别器字段是一个独特的标识符)

....WHERE client0_.Id=@p0 and (SELECT ClientTypes.ClientClassId FROM ClientTypes WHERE ClientTypes.TypeId = client0_.TypeId)='f04c03db-d469-4c01-83c5-5a19c0aea264'

希望这可以帮助其他人解决这个问题。

答案 2 :(得分:0)

简短回答是:除非您使用视图作为表格,否则无法完成。

我在当前的项目中遇到了同样的问题,我不得不使用策略模式来解决它。