假设我有这种关系:
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似乎认为鉴别器是给定表格上的一列(这对我来说很有意义......我知道这是非正统的)。
感谢。
答案 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)
简短回答是:除非您使用视图作为表格,否则无法完成。
我在当前的项目中遇到了同样的问题,我不得不使用策略模式来解决它。