我有一个表 A,它与另一个表 B 有外键关系。首先,我使用原始 SQL 删除 A 中的一个条目 (a)。后来我删除了表 B 中的一个条目 b,这是 a 指向的条目。当我这样做时,EntityFramework 失败并显示错误消息:
实体类型“B”和“A”之间的关联已被切断,但该关系要么被标记为“必需”,要么由于外键不可为空而被隐式要求。
我认为这是因为上下文与数据库不同步。我该如何解决?
我有一个表 A,它与另一个表 B 有外键关系。首先,我使用原始 SQL 删除 A 中的一个条目 (a)。后来我删除了表 B 中的一个条目 b,这是 a 指向的条目。当我这样做时,EntityFramework 失败并显示错误消息:
实体类型“B”和“A”之间的关联已被切断,但该关系要么被标记为“必需”,要么由于外键不可为空而被隐式要求。
我认为这是因为上下文与数据库不同步。我该如何解决?
你的假设是对的。当您使用原始 SQL 更改数据库中的数据时,上下文不知道这些更改。从文档中:
请注意,在从数据库加载或重新加载实体之前,使用 ExecuteSqlCommand 对数据库中的数据所做的任何更改对上下文都是不透明的。
您必须告诉 EntityFramework 从数据库中更新上下文。这可以像这样完成(假设req
这个 SQL 命令只删除了值):
_db.Database.ExecuteSqlCommand($"DELETE FROM \"schema_name\".\"table_A\"");
_db.Entry(req).Reload();