C# 删除实体框架中多对多关系的对象映射

C# 删除实体框架中多对多关系的对象映射,c#,entity-framework,C#,Entity Framework,在ASP.NET MVC中,我有三个表: 用户,角色,用户角色(标准多对多联接表)。 当我将其映射到EF时,它创建了两种实体类型:Users和Roles。 现在我想使用如下代码删除一些用户: var aspnetUsers = _db.aspnet_Users.Single(a => a.UserId == id); _db.aspnet_Users.DeleteObject(aspnetUsers); 当然我不能这样做,因为在表UsersInRoles的SQL级别中有一个连接行 如何从

在ASP.NET MVC中,我有三个表:
用户
角色
用户角色
(标准多对多联接表)。 当我将其映射到EF时,它创建了两种实体类型:
Users
Roles
。 现在我想使用如下代码删除一些用户:

var aspnetUsers = _db.aspnet_Users.Single(a => a.UserId == id);
_db.aspnet_Users.DeleteObject(aspnetUsers);
当然我不能这样做,因为在表
UsersInRoles
的SQL级别中有一个连接行


如何从EF级别删除该行(
UsersInRoles
表未映射)?

在调用上下文上的
SaveChanges()
之前,需要从用户对象中删除所有角色:

var aspnetUser = _db.aspnet_Users.Single(a => a.UserId == id);

foreach(var role in aspnetUser.Roles.ToArray())
{
    aspnetUser.Roles.Remove(role);
}

_db.aspnet_Users.DeleteObject(aspnetUser);

_db.SaveChanges();

这将防止数据库中引用约束引起的异常,并确保UsersInRoles表中的相应记录被删除。

您还可以使用
cascade on delete
选项(form Fluent)来设置表,如果这是您一直想要的行为(虽然我个人不喜欢,但这取决于你的型号/愿望)。