2016-03-25 114 views
4

我有一个从数据库中移除项目的一个问题,如果一个多将它们连接到多关系如何在实体框架删除许多一对多的关系,6

我的数据库看起来像

| [Project] | <-- | [JobInProject] | --> | [Job] | 
=============  ==================  ========= 
| ProjectID |  | JobInProjectID |  | JobID | 
|   |  | ProjectID  |  |  | 
|   |  | JobID   |  |  | 

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

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

代码删除项目项删除:个所有外键被约束,对级联更新

编码删除级联,我用它来删除作业项

Job job = await db.Jobs.FindAsync(id); 
db.Entry(job).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项目?

我会很感激的帮助

+0

'Project和Job表中的主键也被设置为其他表中的外键,您怎么能够在多对多关系中有一个*外键给另一个实体?这意味着你有一对一的关系 –

回答

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这两个外键,但当然一个或多个外键属性是不可空的(都不)。