【问题标题】:Entity Framework adding multiple entities实体框架添加多个实体
【发布时间】:2025-12-20 11:00:12
【问题描述】:

我正在尝试使用 HTTP POST 在我的模型上创建一个新实体列表。

public HttpResponseMessage Post(int requestId, IEnumerable<Component> components)
{
   Request request = database.Request.Find(requestId);
   foreach(var component in components)
   {
         database.Entry(component.ComponentType).State = EntityState.Unchanged;
         database.Entry(component.SourceResource).State = EntityState.Unchanged;
         database.Entry(component.TargetResource).State = EntityState.Unchanged;
         request.Component.Add(component);
   }
   database.SaveChanges();
   return response;
}

当组件列表只有一个元素时,它可以完美运行,但是当它有两个或更多元素时,我会收到以下错误消息:

EntityFramework.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理。 附加信息:附加类型为“AUP.ComponentType”的实体失败,因为同一类型的另一个实体已经具有相同的主键值。 如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,使用 'Add' 方法或 'Added' 实体状态来跟踪图形,然后将非新实体的状态适当地设置为 'Unchanged' 或 'Modified'。

如何只添加组件的字段,并保留对数据库中已存在的 ComponentType、SourceResource 和 TargetResource 的引用?

【问题讨论】:

  • 您确定不添加具有相同主键的元素?你读过错误信息吗?抛出错误的原因非常清楚。您不能添加具有相同主键的多个实例。
  • 组件列表有一组具有相同 ComponentType 的组件,因此 database.Entry(component.ComponentType).State = EntityState.Unchanged 让数据库知道 ComponentType 已经存在并添加对它的引用。

标签: c# entity-framework asp.net-web-api


【解决方案1】:

您需要添加引用而不是 id

认为这可以帮助你stack overflow

【讨论】: