EF 无法移除对象

Posted

技术标签:

【中文标题】EF 无法移除对象【英文标题】:EF Cannot remove object 【发布时间】:2019-11-20 14:07:48 【问题描述】:

在我的模型中,我有类似的表格:

Persons (ID-NAME) 例如(1-保罗 - 2-弗兰克 - 3-乔治)

Roles (ID-NAME) 例如(1-管理员 - 2-开发人员 - 3-初级)

Persons_Roles (ID_PERSON Not Null - ID_ROLE 不为空,例如(1-1 - 1-2 - 2-3 - 2-1 - 3-2)

Persons_RolesPersonsRoles 表上都有一个外键。

我需要删除一个角色。我真的有

Persons oP = DbContext.Persons.Single(p=>p.ID == 1);
Persons_Roles oR = oP.Persons_Roles.Single(p=>p.ID_ROLE == 2);
oP.Persons_Roles.Remove(oR);
DbContext.SaveChanges();

但是我得到了这个错误

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

为什么我会收到此错误,我该如何解决?

【问题讨论】:

我需要删除一个角色 -- 你的意思是Role 还是Person_Role 嗨,Person_Role 不是 Role,我打错了 【参考方案1】:

如果您想删除一条规则,您必须先删除所有引用该规则的记录。 例如,必须先清除 Person_Roles 表中的所有记录,然后从 Role Table 中删除规则

var personRoles = DbContext.Persons_Roles.Where(p=>p.ID_ROLE == 2).ToList();
DbContext.Persons_Roles.RemoveRange(personRoles);
var role = DbContect.Roles.Single(a=>a.ID==2);
DbContext.Roles.Remove(role);
DbContext.SaveChanges();

【讨论】:

嗨,对不起,我的意思是我想删除一个 PERSON_ROLE 而不是一个角色。问题出在代码的第一部分: DbContext.Persons_Roles.RemoveRange(personRoles);这就是我得到错误的地方。 @Fudo 不,这正是你应该做的,而不是oP.Persons_Roles.Remove(oR);。当您从oP.Persons_Roles 中删除时,EF 将尝试将 FK 设置为 null,而从 DbContext.Persons_Roles 中删除将删除记录。 我现在明白你的意思了。谢谢,没关系!【参考方案2】:

如果数据作为外键引用到另一个表,你不能删除,但是你已经完成了

从被引用的表中删除值之后,你只能执行删除操作

【讨论】:

嗨,我的意思是我想删除一个 PERSON_ROLE 而不是一个角色。

以上是关于EF 无法移除对象的主要内容,如果未能解决你的问题,请参考以下文章

EF Core 3.1 无法查询 Json 序列化对象

DTO对象

ef 对象无法序列化的问题(System.Data.Entity.DynamicProxies)

尝试在 Web API Core 中使用 EF Core 在启动时更新数据库时出现“'无法访问已处置的对象”错误

从 DOM 数组中移除 DOM 对象

外键约束,带有子对象集合的 EF