c# - 多对多 EF Core 关系 - 为什么它尝试将实体插入到不同的表中?

标签 c# .net database entity-framework-core blazor

我是 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/

相关文章:

.net - XML 序列化中必需的属性

python - 无法使用存储过程pyodbc SQL SERVER 创建数据库

mysql - 使用 Facebook、Google Play 或 Game Center id 的 MySQL 高分表的主键?

c# - 如何以编程方式单击 WPF 中的按钮?

c# - 结果 : 0x80040154 (REGDB_E_CLASSNOTREG))

c# - 流利的断言 : Assert Collection contains Element that "IsEquivalentTo"

c# - 是否可以根据条件设置临界区?

c# - 更改datagridview日期列上的日期时间显示格式

c# - Selenium 测试用于 Azure Active Directory 登录的 Edge webdriver 时元素被遮挡 登录您的帐户页面

c# - 为什么 10675199.02 :48:05. 4775807 CompilationSection 的 TimeSpan Maximum?