1

我希望我的一个实体与类层次结构具有一对一的关系。把它想象成一个策略模式,每个策略都需要不同的参数来持久化。我尝试使用OneToOneand JoinedBase/的组合JoinedKey,但我遇到了一个问题。

使用这种组合,主实体的主键也作为代表层次结构中根类的表的主键出现,并作为子类的主键出现:

        Order    --------------- TaxCalculator
([PrimaryKey]Id = 1234)        ([PrimaryKey(PrimaryKeyType.Foreign)]OrderId = 1234) 
                                      ^
                                      |
                                      |
                             UkTaxCalculator
                      ([JoinedKey]UkTaxCalculatorId = 1234)

我可以坚持这一点,但是我无法更改TaxCalculator我拥有的子类。当我做类似的事情时:

order.TaxCalculator = new OverseasTaxCalculator(order);

然后尝试刷新,然后 ActiveRecord/NHibernate(可以理解)对现在有TaxCalculators两个Id = 1234.

我可以通过用 / 替换 来解决这个OneToOne问题HasManyBelongsTo并向对象的用户隐藏多重性Order,但我很想知道是否可以用OneToOne.

github 上有完整的代码示例。当第二个被释放时,此代码会引发异常SessionScope。如果您克隆项目,它应该是开箱即用的。

4

2 回答 2

1

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

但是,如果这失败了,为什么不将其映射为一对多而不是多对一与订单表中的外键,重用 TaxCalculators?我会想象它们是非常静态的。

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

于 2009-12-15T23:41:44.453 回答
-1

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

[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...
}
于 2009-12-16T00:12:28.733 回答