无法删除具有多对多关系的对象

时间:2011-02-22 12:56:02

标签: entity-framework entity-framework-4 entity-framework-ctp5 ef-code-first

这些是我的简化实体:

public class User : Entity
{
    public virtual ICollection<Role> Roles { get; set; }
}

public class Role : Entity
{
    public virtual ICollection<User> Users { get; set; }
}

var user = dbContext.Set<User>().Find(id);
dbContext.Set<User>().Remove(user);
dbContext.SaveChanges(); // here i get error (can't delete because it's the     
//referenced by  join table roleUsers

问题是连接表引用了用户表,并且在删除用户之前,ef没有从连接表中删除记录

我尝试编写测试用例,并注意到:

如果使用相同的上下文为用户添加角色,保存更改,删除并再次保存其工作的更改

但如果我使用2个不同的上下文,一个用于插入,另一个用于删除,则会出现此错误

3 个答案:

答案 0 :(得分:2)

您必须首先清除角色集合(必须加载用户的角色),然后才能删除用户。

答案 1 :(得分:1)

如果您想要删除此内容,请执行错误说明。

作为DELETE方法的一部分,您应该按顺序执行此操作。

1)获取用户包括其相关角色,您可以使用User.Include(r =&gt; r.roles)

2)迭代并删除给定用户的角色(确保在执行此循环时使用toList())

3)删除用户

4)savechanges

答案 2 :(得分:0)

user.Roles
    .ToList()
    .ForEach(role => user.Roles.remove(role));

context.Users.remove(user);
context.SaveChanges();