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

Rhy*_*ous 5 c# entity-framework

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

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

在此输入图像描述

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我试过了:

  1. 多个添加的实体可能具有相同的主键,但我已经在使用object属性而不是id属性.

我已经阅读了其他几篇文章.我希望我需要应用一些高级设置.

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

Yul*_*dra 11

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

创建新实体时,实体框架定义临时密钥并将IsTemporary属性设置为true.当您调用SaveChanges方法时,实体框架会分配一个永久密钥并将IsTemporary属性设置为false.- MSDN

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

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

orderLine2.OrderLineId = 2;
orderLine2License.OrderLineId = 2;
Run Code Online (Sandbox Code Playgroud)