繁体   English   中英

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

[英]How delete many-to-many relation in Entity Framework 6

如果将项目与多对多关系联系在一起,我就无法从数据库中删除项目

我的数据库看起来像

| [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();上收到一个错误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两个外键都JobInProjectnull ,但是当然一个或多个外键属性是不可为空的 (两者都不是)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM