我有一组来自不同来源的付款对象,我想在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()
方法似乎没有表格,或者有很多文档(我已经发现)它在封面。
进行更多阅读似乎这可能是不可能的,所以如果有人可以确认这一点或提供解决方案,那将非常感激。
如果我没有提供足够的细节,请告诉我更有用的内容。
提前致谢
答案 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();将是身份的一个很好的替代品。