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

时间:2016-03-25 10:51:45

标签: c# sql-server database entity-framework

如果将数据库中的项目连接成多对多关系

,我会遇到问题

我的数据库看起来像

| [Project] | <-- | [JobInProject] | --> | [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();

上收到错误消息
  

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

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

我将非常感谢您的帮助

1 个答案:

答案 0 :(得分:2)

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

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

如果您不这样做,EF会认为您不想删除该项目,并尝试将这两个外键设置为JobInProjectnull,但当然一个或多个外键属性是不可为空的(两者都不是)。