如何删除Entity Framework 6中的多对多关系

如果将数据库中的项目连接成多对多关系,我会遇到问题

我的数据库看起来像

| [Project] |  | [Job] | ============= ================== ========= | ProjectID | | JobInProjectID | | JobID | | | | ProjectID | | | | | | JobID | | | 

ProjectJob表中的主键也被设置为其他表中的外键但我认为这不是问题,因为当我从Job表中删除项时,它被正确删除,其他表中的所有相关项

所有外键都是通过约束设置的,并且在更新级联上是删除级联

我用来删除工作项的代码

  Job job = await db.Jobs.FindAsync(id); db.Entry(job).State = EntityState.Deleted; await db.SaveChangesAsync(); 

和项目:

 Project project = await db.Projects.FindAsync(id); db.Entry(project).State = EntityState.Deleted; await db.SaveChangesAsync(); 

删除项目项的代码仅从Project表和JobInProject表中删除数据不会删除Job和相关项。

当我修改代码以删除Project如下所示:

  Project project = await db.Projects.FindAsync(id); foreach (var item in project.JobInProjects) { db.Entry(item.Job).State = EntityState.Deleted; } db.Entry(project).State = EntityState.Deleted; await db.SaveChangesAsync(); 

我在await db.SaveChangesAsync();上遇到错误await db.SaveChangesAsync(); 线

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

如何删除Project项目和相关的Job项目?

我将不胜感激

这是因为您没有将JobInProject对象标记为Deleted

 foreach (var item in project.JobInProjects) { db.Entry(item.Job).State = EntityState.Deleted; db.Entry(item).State = EntityState.Deleted; // <= line added } 

如果你不这样做,EF将假设你不想删除该项并尝试将JobInProject两个外键设置为null ,但当然一个或多个外键属性是不可为空的 (两者都是都没有)。