无法确定保存订单 - EF6的关系的主要结束

时间:2014-08-12 23:40:27

标签: c# entity-framework

我正在添加EF6并尝试重新创建遗留数据库的模型。我也在制作WCF Web服务。有太多的字段,所以我最小化了这个例子,以便更好地确定问题。

我正在尝试将一些数据输入到订单的数据库中。订单包括OrderLines,每个OrderLine都可以拥有许可证。 OrderLine在极少数情况下是一对多,所以我必须做一对多。如果一个OrderLine和许可证用于零件,则下一个OrderLine和许可证用于该零件的维护。部件许可证必须链接到维护许可证。

enter image description here

ParentLicenceId是个问题。在我的遗留数据库中,一个许可证与另一个部件类型维护许可证之间存在关系。因此,如果客户购买第X部分,他们可能需要为部分X维修1年。因此,部分X维护许可证将列出部分X许可证作为其父级。

using OrderExample;
using System;
using System.Collections.Generic;

namespace OrderExampleCmd
{
    class Program
    {
        static void Main()
        {
            var omc = new OrderExampleEntities();
            var order = new Order
            {
                OrderNumber = new Guid().ToString(),
                OrderLines = new List<OrderLine>()
            };
            // Maitenance
            var orderLine1 = new OrderLine
            {
                OrderLineNumber = 1,
                Licenses = new List<License>()
            };
            var orderLine1License = new License
            {
                LicenseType = "Maintenance"
            };
            orderLine1.Licenses.Add(orderLine1License);

            // Part
            var orderLine2 = new OrderLine
            {
                OrderLineNumber = 2,
                Licenses = new List<License>()
            };
            var orderLine2License = new License
            {
                LicenseType = "Part",
                MaintenanceLicense = orderLine1License
            };
            orderLine1License.PartLicenses.Add(orderLine2License);

            order.OrderLines.Add(orderLine1);
            order.OrderLines.Add(orderLine2);

            omc.Orders.Add(order);
            omc.SaveChanges();
        }
    }
}

omc.SaveChanges()出现错误信息,是这样的:

无法确定“OrderExampleModel.LicenseParentLicense”关系的主要结尾。多个添加的实体可能具有相同的主键。

我试过了:

  1. Multiple added entities may have the same primary key但我已经在使用object属性而不是id属性。
  2. 我已经阅读了其他几篇文章。我希望我需要应用一些高级设置。

    如何通过此错误保存这些更改?

1 个答案:

答案 0 :(得分:11)

错误是由附加实体中检测到的临时非唯一主键引起的。您需要为订单行分配临时主键和外键。

  

创建新实体时,实体框架定义临时实体   键并将IsTemporary属性设置为true。当你打电话给   SaveChanges方法,实体框架分配永久密钥和   将IsTemporary属性设置为false。 - MSDN

默认情况下orderLine1orderLine2具有相同的临时主键0(默认值为整数),您需要将它们设置为临时,以防止2个订单行具有相同的临时ID(即是0)。

orderLine1.OrderLineId = 1;
orderLine1License.OrderLineId = 1;

orderLine2.OrderLineId = 2;
orderLine2License.OrderLineId = 2;