2

我有一组来自不同来源的支付对象,我想在 NHibernate 中使用 TPC 继承。所有这些对象的基础是支付处理器(所以都具有一致的格式),但是在数据库中没有基类的表示。我想我的映射已经解决了,除了我在尝试插入时抛出异常 - “不能使用 <union-subclass> 映射的身份列键生成:<EntityName>”

课程:

public class BasePayment
{
    public virtual int Id { get; set; }
    public virtual PaymentSource Source { get; set; }
    public virtual DateTime Date { get; set; }
    public virtual decimal Amount { get; set; }
}

public class SubPayment : BasePayment
{
}

映射:

public class BasePaymentMap : ClassMap<BasePayment>
{
    public BasePaymentMap()
    {
        UseUnionSubclassForInheritanceMapping();
        DiscriminateSubClassesOnColumn("Source");
        Id(m => m.Id);
        Map(m => m.Source);
        Map(m => m.Amount);
        Map(m => m.Date);
    }
}

public class SubPaymentMap : SubclassMap<SubPayment>
{
    public SubPaymentMap()
    {
        DiscriminatorValue(PaymentSource.SourceX);
        Abstract();
        Table("SourceXPayments");
    }
}

这就是我所知道的。在 SaveOrUpdate 上,我收到上述错误,到目前为止,谷歌搜索并没有帮助 - 我发现了这个问题:Cannot use identity column key generation with <union-subclass> ( TABLE_PER_CLASS )这似乎涵盖了这个问题在 Java/Hibernate 中,但是我在将其转换@GeneratedValue(strategy = GenerationType.TABLE)为 Fluent 语法时遇到了问题,因为 Fluent NHibernate 的GeneratedBy()方法似乎没有表格,或者很多文档(我已经找到)关于它的作用封面。

做一些更多的阅读似乎这可能是不可能的,所以如果有人可以确认这一点或提供解决这种情况的方法,我们将不胜感激。

如果我没有提供足够的细节,请让我知道还有什么用处。

提前致谢

4

1 回答 1

6
UseUnionSubclassForInheritanceMapping();
DiscriminateSubClassesOnColumn("Source");

是冲突的,FNH 将忽略一个。

UseUnionSubclassForInheritanceMapping表示每个类都有自己的包含所有列的表,并且该表用于区分类,不需要列

DiscriminateSubClassesOnColumn意味着继承层次结构的每个类都存在于同一个表中,并且使用一列来区分这些类。

错误消息意味着当使用UseUnionSubclassForInheritanceMapping身份生成时不允许使用,因为 id 仅对一个表是唯一的,但 NHibernate 威胁所有子类作为一个集合,其中 id 必须是唯一的。

egsession.Get<BaseClass>(5);将不再可靠地工作,因为可能有多个具有相同 ID 的子类。

@GeneratedValue(strategy = GenerationType.TABLE)只是告诉“使用身份以外的其他策略”。GeneratedBy.HiLow(); 将是一个很好的替代身份。

于 2012-05-25T06:24:57.650 回答