gpt4 book ai didi

c# - 使用 FluentNHibernate 实现每个类的表继承 - 身份生成

转载 作者:行者123 更新时间:2023-12-02 14:24:33 25 4
gpt4 key购买 nike

我有一组来自不同来源的支付对象,我想在 NHibernate 中使用 TPC 继承。所有这些对象的基础是支付处理器(因此都具有一致的格式),但是数据库中没有基类的表示。我想我已经完成了映射,除了在尝试插入时抛出异常 - “无法使用带有 映射的标识列键生成:

类(class):

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()方法似乎没有表格,也没有很多文档(我找到的)来说明它的幕后功能。

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

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

提前致谢

最佳答案

UseUnionSubclassForInheritanceMapping();
DiscriminateSubClassesOnColumn("Source");

存在冲突,FNH 将忽略其中一个。

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

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

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

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

@GeneratedValue(strategy = GenerationType.TABLE)只是告诉“使用身份之外的另一种策略”。生成者.HiLow();将是身份的一个很好的替代方案。

关于c# - 使用 FluentNHibernate 实现每个类的表继承 - 身份生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10737531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com