.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 之后处理它,它似乎可以工作......但这是否有效?我感觉不行?
这看起来很奇怪,你使用的是什么实体配置?属性或类似
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 服务器)