【问题标题】:Discriminator based on joined property基于联合财产的鉴别器
【发布时间】:2010-04-29 19:16:02
【问题描述】:

假设我有这种关系:

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 关系设置一个 table-per-hierarchy 继承映射,但使用 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>

有没有办法用&lt;discriminator&gt;、&lt;join&gt; 或&lt;many-to-one&gt; 完成类似的事情? NHiberante 似乎假设鉴别器是给定表上的一列(这对我来说很有意义。我知道这是非正统的)。

谢谢。

【问题讨论】:

    标签: nhibernate nhibernate-mapping


    【解决方案1】:

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

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

    【讨论】:

    • 为我工作!请参阅下面的笔记。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      简短的回答是:不能这样做,除非您使用视图作为表格。

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

      【讨论】:

        猜你喜欢
        • 2019-03-05
        • 2011-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-29
        • 2014-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多