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()方法似乎没有表格,或者很多文档(我已经发现)它在封面.
做一些更多的阅读似乎这可能是不可能的,所以如果任何人都可以确认这一点或提供解决方案的工作,我们将不胜感激.
如果我没有给出足够的细节,请告诉我更有用的内容.
提前致谢
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(); 将是身份的一个很好的替代品.
| 归档时间: |
|
| 查看次数: |
2505 次 |
| 最近记录: |