使用FluentNHibernate进行每类继承的表 - 身份生成

时间:2012-05-24 12:29:43

标签: c# fluent-nhibernate

我有一组来自不同来源的付款对象,我想在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()方法似乎没有表格,或者有很多文档(我已经发现)它在封面。

进行更多阅读似乎这可能是不可能的,所以如果有人可以确认这一点或提供解决方案,那将非常感激。

如果我没有提供足够的细节,请告诉我更有用的内容。

提前致谢

1 个答案:

答案 0 :(得分:6)

UseUnionSubclassForInheritanceMapping();
DiscriminateSubClassesOnColumn("Source");

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

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

DiscriminateSubClassesOnColumn表示继承层次结构的每个类都存在于同一个表中,而一列用于区分类。

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

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

@GeneratedValue(strategy = GenerationType.TABLE)只是告诉“使用另一种策略而非身份”。 GeneratedBy.HiLow();将是身份的一个很好的替代品。