无法使用 EF Core 循环\插入,无法跟踪,因为已跟踪具有相同键值的另一个实例

问题描述 投票:0回答:1

.NET 4.8 上的 EF Core 2.1、ASP.NET MVC。

我有一个正在发布的数组,我只需要简单地循环遍历这些项目,然后插入到数据库中。

但是它一直抛出这个错误:

无法跟踪,因为已跟踪具有相同键值 {'Learner Id'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。

LearnerId
只是一个带有 FK 的普通非空 Guid。

我在这里错过了什么,我已经尝试了我能想到的一切,我快疯了。我可能通常确实希望跟踪物体,但在这种情况下。我只是想将它插入到数据库中,而不需要创建整个存储过程来完成它。

using (var context = new MyContext())
{
    var items = new List<MyItems>();

    foreach (var e in encountersArray)
    {
        items.Add(new MyItem() 
                      {
                          Id = Guid.NewGuid(),
                          LearnerId = learnerId,
                          EncounterId = e,
                          Modified = DateTime.Now
                      });
    }

    context.AddRange(items);
    context.SaveChanges();
}

Id 字段甚至是 newid() 在数据库中自动生成的,这里甚至不需要它,我只是尝试我能想到的一切。

现在,如果我将新的上下文放入 foreach 中,以便在每次 ADD 之后处理它,它似乎可以工作......但这是否有效?我感觉不行?

entity-framework-core ef-core-2.1
1个回答
0
投票

这看起来很奇怪,你使用的是什么实体配置?属性或类似

IEntityTypeConfiguration
之类的东西?我会检查 EF 是否将“Id”识别为 PK,而不是“LearnerId”。例如,实体类名为“MyItem”或“Learner”是偶然的吗?如果是“Learner”约定,则默认情况下可能会选择“LearnerId”作为键。尝试明确地将“Id”标记为 PK:

[Key]
public Guid Id { get; protected set; }

您收到的错误意味着它正在使用 LearnerId 作为实体/表的 PK。

通常对于 PK,最好通过使用

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
将键标记为标识列来让数据库分配 PK 值,而不是依赖代码来设置新 ID。在数据库端,您可以将列的默认值设置为
NewId()
NewSequentialId()
。 (SQL 服务器)

© www.soinside.com 2019 - 2024. All rights reserved.