FOREIGN KEY约束在尝试删除值对象中引用的实体时失败

问题描述 投票:0回答:1

感兴趣的域

我正在编写POS软件。它具有汇款方式的概念,其中一些是物理

每种物理方式都允许一些面额,它们实际上是面值法定货币的组合。例如:1美元,5欧元,10瑞士法郎,等等。

[货币是一个独立的实体,其生活(出于其他目的)没有任何汇款手段。另一方面,面额取决于one汇款平均值。

当前执行状态

到目前为止,我已经将该领域成功地建模到了我的模型中

public abstract class FiatCurrency : AggregateRoot
{
    public virtual Currency Currency { get; }

    public FiatCurrency(Currency currency)
    {
        Currency = currency;
    }

    protected FiatCurrency() { }
}

public abstract class PhysicalMoneyTransferMean : MoneyTransferMean
{
    private IDictionary<FiatCurrency, string> DenominationsInternal { get; }
    public virtual IReadOnlyDictionary<FiatCurrency, List<FaceValue>> Denominations => DenominationsInternal.ToDictionary(_ => _.Key,
                                                                                                                          _ => _.Value
                                                                                                                                .Split(';')
                                                                                                                                .Select(s => new FaceValue(s))
                                                                                                                                .ToList());

    public static class Expressions
    {
        public static readonly Expression<Func<PhysicalMoneyTransferMean, IDictionary<FiatCurrency, string>>> Denominations = x => x.DenominationsInternal;
    }

    public PhysicalMoneyTransferMean(MoneyTransferMeanDirection direction, IList<ForeignCurrency> extraCurrencies, IDictionary<FiatCurrency, List<FaceValue>> denominations)
        : base(direction, extraCurrencies)
    {
        DenominationsInternal = denominations.ToDictionary(kv => kv.Key, kv => string.Join(";", kv.Value));
    }

    protected PhysicalMoneyTransferMean() { }
}

映射:

public class FiatCurrencyMap : ClassMap<FiatCurrency>
{
    public FiatCurrencyMap()
    {
        Id(Entity.Expressions<FiatCurrency>.Id);
        Map(c => c.Currency)
            .CustomType<CurrencyUserType>();
        DiscriminateSubClassesOnColumn("Type");
    }
}

public sealed class PhysicalMoneyTransferMeanMap : SubclassMap<PhysicalMoneyTransferMean>
{
    public PhysicalMoneyTransferMeanMap()
    {
        HasMany(PhysicalMoneyTransferMean.Expressions.Denominations)
            .Table("Denomination")
            .AsEntityMap()
            .Element("FaceValues")
            .Cascade.SaveUpdate()
            .Not.LazyLoad();
    }
}

到目前为止,上面的映射产生了以下数据库结构(我在SQLite上:]

CREATE TABLE "FiatCurrency" (Id  integer primary key autoincrement, Type TEXT not null, Currency TEXT not null, ExchangeRateToLocalCurrency NUMERIC)

CREATE TABLE "MoneyTransferMean" (Id  integer primary key autoincrement, Type TEXT not null, Direction INT not null)

CREATE TABLE Denomination (PhysicalMoneyTransferMeanId BIGINT not null, FaceValues TEXT, FiatCurrency_id BIGINT not null, primary key (PhysicalMoneyTransferMeanId, FiatCurrency_id), constraint FK_367B2B77 foreign key (PhysicalMoneyTransferMeanId) references "MoneyTransferMean", constraint FK_4E155579 foreign key (FiatCurrency_id) references "FiatCurrency")

问题

[从数据库中删除汇款单时,NHibernate也会成功删除关联的面额,但是,在删除法定货币时,我收到以下(“明显”)消息:

could not execute update query[SQL: delete from "FiatCurrency" where Type='Local' and ?=1] ---> System.Data.SQLite.SQLiteException: constraint failed FOREIGN KEY constraint failed

我的问题是,如何在删除法定货币本身之前告诉NHibernate删除所有引用法定货币的面额?

c# nhibernate fluent-nhibernate fluent-nhibernate-mapping
1个回答
0
投票

作为一种解决方法,您可以先删除FiatCurrency,然后从数据库中删除汇款平均值。

© www.soinside.com 2019 - 2024. All rights reserved.