Entity framework can';t删除具有多对多关系的对象

Entity framework can';t删除具有多对多关系的对象,entity-framework,entity-framework-4,entity-framework-ctp5,ef-code-first,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);

这些是我的简化实体:

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
公共类用户:实体
{
公共虚拟ICollection角色{get;set;}
}
公共类角色:实体
{
公共虚拟ICollection用户{get;set;}
}
var user=dbContext.Set().Find(id);
dbContext.Set().Remove(用户);
dbContext.SaveChanges();//这里我得到错误(无法删除,因为它是
//由联接表角色扮演者引用
问题在于联接表引用了用户表,而ef在删除用户之前不会从联接表中删除记录

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

如果使用相同的上下文添加具有角色的用户、保存更改、删除更改,然后再次保存更改,则可以正常工作


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

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

如果您只想得到此删除操作,请按错误所述操作

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

1) 获取用户,包括其相关角色,您可以使用用户。包括(r=>r.roles)

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

3) 删除用户


4) savechanges

@Ladislav Mrnka为了删除用户,我必须在删除之前强制加载所有“惰性”集合?@Omu:您可以尝试其他方法。在删除对象(不包含集合)之前从DB加载该对象。@Ladislav Mrnka我正在执行dbContext.Set().Remove(dbContext.Set().Find(id));dbContext.SaveChanges();我得到了error@Omu:好的,我希望它能起作用。不太可能,所以你应该按照我以前的建议来做。@Ladislav Mrnka,有没有一些通用的方法?我在通用存储库中执行此操作
user.Roles
    .ToList()
    .ForEach(role => user.Roles.remove(role));

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