C#实体框架主键冲突

C#实体框架主键冲突,c#,entity-framework,C#,Entity Framework,我从外部API获取数据,并希望使用实体框架将其保存在SQL Server中。我得到的数据是订单信息。数据大致如下所示: 订单: 订单号 顾客 送货地址 项目 客户: 客户ID 客户详细信息 问题是,任何客户都可以下多个订单。我的实体框架基于订单信息。因此,如果一个客户下了多个订单,我会得到一个主键冲突,因为该客户已经在数据库中,即使该订单没有 供参考:我通常添加这样的订单:orderContext.orders.add(order) 由于每个订单都包含客户数据,我无法在不“添加”客户的情

我从外部API获取数据,并希望使用实体框架将其保存在SQL Server中。我得到的数据是订单信息。数据大致如下所示:

订单:

  • 订单号

  • 顾客

  • 送货地址

  • 项目

客户:

  • 客户ID
  • 客户详细信息
问题是,任何客户都可以下多个订单。我的实体框架基于订单信息。因此,如果一个客户下了多个订单,我会得到一个主键冲突,因为该客户已经在数据库中,即使该订单没有

供参考:我通常添加这样的订单:
orderContext.orders.add(order)

由于每个订单都包含客户数据,我无法在不“添加”客户的情况下添加订单。即使我要检查现有客户,我仍然必须将记录添加到Orders表中,这仍然会引发问题。有没有办法告诉EF添加或更新每个“子”类


这里的例子比实际数据更简单。还有其他几个类似的依赖项,因此即使我切换到使用Customer类作为EF的基础,它仍然会有这个问题。

像这样更改您的表:

将CustomerID添加到您的
订单
表中,这是因为每个
订单
都只有一个客户
,每个
客户
都有多个或零个订单

订单(订单ID、客户ID、发货地址)


Customer(CustomerID,…)

您有客户id。为什么不能使用该id来匹配该客户以前的实例;进行必要的更新?数据库的结构是什么?它有订单表和客户表吗?显示您的实体和一个示例API响应,该响应被强制转换并保存到SQL server(代码)。我猜您正在为订单分配一个断开连接的客户。插入订单时,EF认为它是新客户(因为它已断开连接),并尝试插入另一个具有相同ID的客户。如果是这种情况,解决方案是使用CustomerID而不是navigation属性,或将客户作为未修改的条目附加到上下文。
Add
还将尚未附加到上下文的相关实体标记为
Added