Nhibernate 基于连接属性的鉴别器

Nhibernate 基于连接属性的鉴别器,nhibernate,nhibernate-mapping,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,

假设我有这种关系:

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关系设置一个表/层次继承映射,但使用联接类中的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>
有什么方法可以用,或者,来完成这样的事情吗?NHiberante似乎假设鉴别器是给定表上的一列,这对我来说很有意义。。我知道这是非正统的


谢谢。

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


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

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


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

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


您不能使用带有子选择的鉴别器公式吗


我在寻找完全相同的东西,在看到迭戈的帖子后,我认为这是不可能的,于是继续搜索谷歌,试图找到替代品。但在通过反复试验找到一个有效的解决方案后,我意识到这与上面Meriton发布的解决方案完全相同。我遇到的警告,他解释了,但没有解释是,你必须在forumla中完全限定你的字段,你必须只返回一个字段,你必须把你的公式括在括号里。如果将表名保留在字段名之外,它将假定它是查询所针对的当前表上的一个字段,并将以类似MyTable0\u 1的前缀作为前缀。这将打破你的疑问。括号需要像嵌套的select语句一样呈现出来。使用公式将确定要与子类中的鉴别器值进行比较的鉴别器字段的值。当我检查正在发送的SQL时,我发现它实际上给了我这个。。。注意,我的鉴别器字段是唯一标识符

..其中client0.Id=@p0,并从ClientTypes.TypeId=client0.TypeId='f04c03db-d469-4c01-83c5-5a19c0aea264'


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

我正在寻找完全相同的东西,在看到迭戈的帖子后,我认为这是不可能的,于是继续搜索谷歌,试图找到替代品。但在通过反复试验找到一个有效的解决方案后,我意识到这与上面Meriton发布的解决方案完全相同。我遇到的警告,他解释了,但没有解释是,你必须在forumla中完全限定你的字段,你必须只返回一个字段,你必须把你的公式括在括号里。如果将表名保留在字段名之外,它将假定它是查询所针对的当前表上的一个字段,并将以类似MyTable0\u 1的前缀作为前缀。这将打破你的疑问。括号需要像嵌套的select语句一样呈现出来。使用公式将确定要与子类中的鉴别器值进行比较的鉴别器字段的值。当我检查正在发送的SQL时,我发现它实际上给了我这个。。。注意,我的鉴别器字段是唯一标识符

..其中client0.Id=@p0,并从ClientTypes.TypeId=client0.TypeId='f04c03db-d469-4c01-83c5-5a19c0aea264'


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

对我有用!请看下面我的笔记。为我工作!见下面我的笔记。
<discriminator formula="(select j.discriminator from Joined j where j.id = joinedid)">