Nhibernate 是否可以使用JoinedBase持久化与类层次结构的OneToOne关系?

Nhibernate 是否可以使用JoinedBase持久化与类层次结构的OneToOne关系?,nhibernate,castle-activerecord,one-to-one,Nhibernate,Castle Activerecord,One To One,我希望我的一个实体与类层次结构具有一对一的关系。将其视为一种策略模式,其中每个策略都需要不同的参数来持久化。我试着结合使用OneToOne和JoinedBase/JoinedKey,但遇到了一个问题 通过这种组合,主实体的主键还显示为表示层次结构中根类的表的主键,以及子类的主键: Order --------------- TaxCalculator ([PrimaryKey]Id = 1234) ([PrimaryKey(PrimaryKeyType.For

我希望我的一个实体与类层次结构具有一对一的关系。将其视为一种策略模式,其中每个策略都需要不同的参数来持久化。我试着结合使用
OneToOne
JoinedBase
/
JoinedKey
,但遇到了一个问题

通过这种组合,主实体的主键还显示为表示层次结构中根类的表的主键,以及子类的主键:

        Order    --------------- TaxCalculator
([PrimaryKey]Id = 1234)        ([PrimaryKey(PrimaryKeyType.Foreign)]OrderId = 1234) 
                                      ^
                                      |
                                      |
                             UkTaxCalculator
                      ([JoinedKey]UkTaxCalculatorId = 1234)
我可以很好地坚持下去,但是我不能改变我拥有的
TaxCalculator
的哪个子类。当我做以下事情时:

order.TaxCalculator = new OverseasTaxCalculator(order);
然后尝试刷新,然后ActiveRecord/NHibernate(可以理解)对现在有两个Id为1234的
TaxCalculator
感到不高兴

我可以通过将
OneToOne
替换为
HasMany
/
BelongsTo
,并对
Order
对象的用户隐藏多重性来解决这个问题,但我想知道是否可以使用
OneToOne
来实现这一点


这里有一个完整的代码示例。当第二个
会话范围
被释放时,此代码引发异常。如果你克隆了这个项目,它应该会开箱即用。

首先很抱歉,我没有尝试我的解决方案。太晚了,我真的需要睡觉;-)。我认为一对一的唯一方法是“每个层次结构的表”——使用鉴别器列而不是每个子类的表的方法。也许这将使您能够将现有对象变形为另一个子类。另一种方式是,像多态删除孤儿这样的东西不幸地不被支持,正如您所说的那样。所以我猜这是你最后的选择

但是如果失败了,为什么不将其映射为一对多,而不是在order表中使用外键的多对一,重用taxcalculator呢?我认为它们是相当静止的


有趣的想法是:多态删除孤儿。

我们做了一些与您尝试做的非常相似的事情。我认为是您的一对一组合和连接键导致了问题。试试这个:

[ActiveRecord, JoinedBase]
public class TaxCalculator
{
    protected int TaxCalculatorId;

    [PrimaryKey]
    public virtual int Id
    {
        get { return TaxCalculatorId; }
        set { TaxCalculatorId = value; }
    }

    // common tax calculation fields, methods etc...
}

[ActiveRecord]
public class OverseasTaxCalculator : TaxCalculator
{
    [JoinedKey]
    public override int Id
    {
        get { return TaxCalculatorId; }
        set { TaxCalculatorId = value; }
    }

    // overseas tax calculation specific methods, properties etc...
}

谢谢zoidbeck。很高兴听到不是只有我不能让它工作。听起来我们可以使它适用于每个层次结构的表(SingleTableInheritation)。我们更喜欢每个类的表(ClassTableInheritation),这样就不需要更改基表来添加新的计算器(开放/关闭原则)。在我的真实领域(不是Orders和TaxCalculator),每个“Order”的“TaxCalculator”都有不同的参数,所以你的其他想法不适用。我的缺点是没有选择更好的示例域!我错过什么了吗?您的解决方案似乎适合于类层次结构,但我看不出它在哪里解决了一对一的关系。这是我要求的关键部分。