我正在添加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();
}
}
}
omc.SaveChanges()出现错误信息,是这样的:
无法确定“OrderExampleModel.LicenseParentLicense”关系的主要结尾。多个添加的实体可能具有相同的主键。
我试过了:
我已经阅读了其他几篇文章。我希望我需要应用一些高级设置。
如何通过此错误保存这些更改?
答案 0 :(得分: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;