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

Ian*_*ill 2 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
{
}
Run Code Online (Sandbox Code Playgroud)

映射:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的.在SaveOrUpdate上,我收到上面的错误,谷歌搜索到目前为止没有证明有用 - 我发现了这个问题:不能使用<union-subclass>(TABLE_PER_CLASS)生成身份列密钥,这似乎涵盖了这个问题在Java/Hibernate中,但我遇到了将转换@GeneratedValue(strategy = GenerationType.TABLE)为Fluent语法的问题,因为Fluent NHibernate的GeneratedBy()方法似乎没有表格,或者很多文档(我已经发现)它在封面.

做一些更多的阅读似乎这可能是不可能的,所以如果任何人都可以确认这一点或提供解决方案的工作,我们将不胜感激.

如果我没有给出足够的细节,请告诉我更有用的内容.

提前致谢

Fir*_*iro 6

UseUnionSubclassForInheritanceMapping();
DiscriminateSubClassesOnColumn("Source");
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

例如session.Get<BaseClass>(5);,由于可能存在多个具有相同id的子类,因此将不再可靠地工作.

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