【问题标题】:"The relationship could not be changed bc one or more of the foreign-key properties is non-nullable" - But not deleting anything“无法更改关系,因为一个或多个外键属性不可为空” - 但不删除任何内容
【发布时间】:2014-04-19 10:13:38
【问题描述】:

在添加多个订单实体后尝试在上下文中保存更改()时出现以下错误:

操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当一个 对关系进行更改,相关的外键属性是 设置为空值。如果外键不支持空值, 必须定义一个新的关系,外键属性必须是 分配了另一个非空值,或者不相关的对象必须是 已删除。

现在我知道错误的含义了,而且我已经搜索了很多信息。问题是,我不会删除任何东西或覆盖任何东西(据我所知)。

我在从亚马逊导入订单时在我的主应用程序中遇到了这个错误,因此我将代码剥离到控制台应用程序中以尝试缩小范围,但到目前为止还没有成功。

控制台应用程序现在正在做我能想到的最低限度的重新创建错误 - 只需创建两个测试订单并调用 Save。现在有趣的是 两个 测试命令 - 不是一个。如果我只添加一个订单并调用 Save,我不会收到错误 - 只有当我将多个订单添加到实体列表时才会发生这种情况。

(现在我可以在每次添加之后调用 Save(),但是要导入很多订单,这会慢一些。此外,我想深入了解一下 - 它曾经工作过)

我正在考虑我最近对应用程序所做的更改可能会导致此问题 - 有一个更改,但我正在努力思考可能导致此问题的方式。

以前,每个 Order 记录都与名为 Payments 的表有一个(可为空的)关系。我从模型中删除了该表(和关系)并创建了一个类似的表和关系,称为 Receipts。 (想法是每个订单都将有零个或一个收据实体与之关联)。

添加的测试订单没有收据(根据模型,这是有效的 - ReceiptId 可以为空),我在任何地方都找不到旧 Payments 表的任何痕迹。

如果有办法找出此错误所抱怨的关系,以便我可以进一步缩小范围?

    private static void Main(string[] args)
    {
        var unitOfWork = new UnitOfWork();

        var orders = GetOrders(unitOfWork);

        foreach (var order in orders)
        {
            unitOfWork.OrdersRepository.AddOrder(order);
        }

        unitOfWork.Save();

        Console.WriteLine("Done.");
        Console.ReadLine();
    }

    private static IEnumerable<Order> GetOrders(IUnitOfWork unitOfWork)
    {
        // Use defaults
        var country = unitOfWork.CountriesRepository.GetCountryById(223);
        var source = unitOfWork.OrderSourceRepository.GetSourceById("AMZ");
        var impression = unitOfWork.PostageImpressionRepository.GetPostageImpressionById(1);

        for (var i = 0; i < 2; i++)
        {
            yield return
                new Order
                    {
                        Address1 = "Address 1",
                        Address2 = "Address 2",
                        Address3 = "Address 3",
                        Town = "Town ",
                        County = "County",
                        EMail = "test@test.com",
                        ExternalOrderRef = "Ref",
                        FullName = "Test Order " + i,
                        OrderDate = DateTime.Now,
                        OrderSource = source,
                        Postcode = "AA11AA",
                        Telephone = "0123456789",
                        ExternalStatus = "New",
                        Total = 1.23m,
                        Paid = true,
                        PaidDate = DateTime.Now,
                        ShippedDate = null,
                        Cancelled = false,
                        Country = country,
                        Receipt = null,
                        PostageImpression = impression,
                        SubTotal = 1.23m,
                        PostageCost = 0.00m
                    };
        }
    }

【问题讨论】:

  • 测试控制台应用程序的代码草图可能有助于缩小问题范围。

标签: c# sql entity-framework


【解决方案1】:

事实证明,我在实体对象上重写了 Equals(),这让 Entity Framework 感到困惑。

查看这里了解更多信息:

http://axilis.hr/entity-framework-override-equals-problem

我通过升级到 EF 6 解决了这个问题。

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 2013-10-19
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多