gpt4 book ai didi

c# - 将同一实体映射到不同的表

转载 作者:行者123 更新时间:2023-12-04 04:39:42 25 4
gpt4 key购买 nike

一点领域知识

我正在编写一个 POS(销售点)软件,它允许支付商品或退款。
支付或退款时,需要指定汇款手段使用:现金、电子转帐(~=信用卡)、成员(member)卡、代金券等。

这些汇款方式是一组有限且已知的值(一种枚举)。

棘手的部分是我需要能够在 POS 终端上存储这些方式的自定义子集,用于支付和退款(这两组可能不同)。

例如:

  • 可用支付方式:现金、电子转帐、成员(member)卡、优惠券
  • 可用退款方式:现金、代金券

  • 实现现状

    我选择实现汇款方式的概念如下:
    public abstract class MoneyTransferMean : AggregateRoot
    {
    public static readonly MoneyTransferMean Cash = new CashMoneyTransferMean();
    public static readonly MoneyTransferMean EFT = new EFTMoneyTransferMean();
    // and so on...

    //abstract method

    public class CashMoneyTransferMean : MoneyTransferMean
    {
    //impl of abstract method
    }

    public class EFTMoneyTransferMean : MoneyTransferMean
    {
    //impl of abstract method
    }

    //and so on...
    }

    它不是“普通枚举”的原因是这些类内部存在一些行为。为了在 FluentNHibernate 映射中引用它们,我还必须声明内部类是公共(public)的(而不是私有(private)的)(见下文)。

    如何使用

    支付和退款方式总是作为一组存储在数据库中或从数据库中检索。它们实际上是两个不同的集合,即使两个集合中的某些值可能相同。

    用例一:定义一套新的支付/退款方式
  • 删除所有现有的付款/退款方式
  • 插入新的

  • 用例2:检索所有支付/退款方式
  • 获取所有存储的付款/退款方式的集合

  • 问题

    我在持久性方面坚持我目前的设计。我正在使用 NHibernate(使用 FluentNHibernate 来声明类映射),但我找不到将其映射到某些有效数据库模式的方法。

    我发现可以使用 entity-name 多次映射一个类。但是我不确定子类是否可行。

    我还没有准备好更改 MoneyTransferMean 公共(public) API 以使其能够持久化(例如添加 bool isRefund 以区分两者)。但是添加一些私有(private)鉴别器字段左右是可以的。

    我当前的映射:
    public sealed class MoneyTransferMeanMap : ClassMap<MoneyTransferMean>
    {
    public MoneyTransferMeanMap()
    {
    Id(Entity.Expressions<MoneyTransferMean>.Id);
    DiscriminateSubClassesOnColumn("Type")
    .Not.Nullable();
    }
    }

    public sealed class CashMoneyTransferMeanMap : SubclassMap<MoneyTransferMean.CashMoneyTransferMean>
    {
    public CashMoneyTransferMeanMap()
    {
    DiscriminatorValue("Cash");
    }
    }

    public sealed class EFTMoneyTransferMeanMap : SubclassMap<MoneyTransferMean.EFTMoneyTransferMean>
    {
    public EFTMoneyTransferMeanMap()
    {
    DiscriminatorValue("EFT");
    }
    }

    //and so on...

    此映射可以编译,但是它只生成 1 个表,并且在查询此表时我无法区分付款/退款。

    我试图声明两个引用这两个映射 MoneyTransferMean使用不同的表和实体名称,但这导致我出现异常 Duplicate class/entity mapping MoneyTransferMean+CashMoneyTransferMean .

    我还尝试复制子类映射,但我无法指定“父映射”,这导致我遇到与上述相同的异常。

    问题

    是否存在保留我当前域实体的解决方案?

    如果不是,我需要对我的实体执行的最小重构是什么,以使它们可以与 NHibnernate 持久化?

    最佳答案

    为什么不创建一个实体 MoneyTransferMean ,具有所有公共(public)属性(字段),只需添加 2 个额外字段( bool 值)即可确定 MoneyTransferMean 是 Payment 还是 Refund,还是两者兼而有之????坚持与否。

    也可以使用带有 Id (PK) 的额外实体来完成,添加相同的额外字段,与 MoneyTransferMean 的关系将是 1:1。丑陋,我知道,但它应该工作。

    关于c# - 将同一实体映射到不同的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59421648/

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