我是 Entity Framework Core 的新手,我正在尝试将一行插入到与另一个表具有多对多关系的表中。
我使用的是代码优先方法,因此我没有显式创建连接表,让 EF Core 比我做得更好。
问题是:我尝试向 tableA
添加一行(使用 AddAsync
);该行/对象已经包含所有必需的初始化属性,包括 tableB
类型的对象列表;当我执行查询 (SaveChangesAsync
) 时,出现此错误:
SqlException: Cannot insert explicit value for identity column in table 'tableB' when IDENTITY_INSERT is set to OFF
我不明白为什么 EF Core 尝试在 tableB
中插入新行(由于值已存在而引发异常)。我只是希望它插入 tableA
中的行以及连接表中的相关键。
有人可以帮我吗?
我几个小时以来一直在寻找答案,但找不到任何有用的东西。
最佳答案
EF(核心)在变更跟踪概念之上工作。为了正确处理现有实体,EF 的 DbContext 需要跟踪它们,否则它会将它们视为新实体,并尝试将新行插入数据库。考虑以下示例:
TableA a = new ...;
TableB iKnowItExistsButCtxDoesNot = new TableB // can be mapped from frontend for example
{
Id = SomeExistingId
};
a.TableBs.Add(iKnowItExistsButCtxDoesNot);
context.TableA.Add(a);
context.SaveChanges();
这将导致 EF 尝试为 iKnowItExistsButCtxDoesNot
插入新行。解决方法之一是在添加 a
之前附加它:
// ...
context.TableB.Attach(iKnowItExistsButCtxDoesNot);
context.TableA.Add(a);
// ...
另请阅读:
关于c# - 多对多 EF Core 关系 - 为什么它尝试将实体插入到不同的表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76946225/