实体框架通过ID删除N:M关系

时间:2015-03-05 14:00:27

标签: c# entity-framework many-to-many entity-relationship

我有一个像这样的简单表:

  

用户(Id,FirstName,...)< ===>角色(身份证,头衔,......)

巫婆有N:M的关系

我想要做的是通过拥有ID来删除它们之间的关系,所以我的方法应该是这样的:

public void UnlinkUsersFromRoles(int[] roleIds, int[] userIds)
{
    var myContext = new DefaultContext();
    // ?? <= how to break the relation without loading unnecessary columns
}

2 个答案:

答案 0 :(得分:0)

你能做到这一点:

var rolesToRemove = myContext.Roles.Where(r=> roleIds.Contains(r.Id)).ToArray();
foreach(var user in myContext.Users.Where(u=> userIds.Contains(u.Id)){
   forearch(var var role in rolesToRemove) {
       user.Roles.Remove(role);
   } 
}
myContext.SaveChanges();

当你说:

  

如何在不加载不必要的列的情况下打破关系

你的意思是,上面的代码并不能满足你的要求吗?

编辑:

如果您有像UserInRoles这样的明确关系类,您应该使用John Castleman Answer,或者只创建一个,映射ForeignKeys并使用他的解决方案。

答案 1 :(得分:0)

如果这是多对多关系,则必须在它们之间有一个连接表:对于这些表UserRole,假设它被称为UserRole,并且是简单连接表(即,该表上没有其他列,除了其他两个表的FK ID):

public class UserRole
{
    public int UserId { get; set; }
    public int RoleId { get; set; }
}

使用明确定义的连接表,UnlinkUsersFromRoles可以定义如下:

public void UnlinkUsersFromRoles(int[] roleIds, int[] userIds)
{
    using (var context = new DefaultContext())
    {
        foreach (var ur in context.UserRoles
                                  .Where(u => userIds.Contains(u.UserId))
                                  .Where(r => roleIds.Contains(r.RoleId))
                                  .ToArray())
        {
            context.UserRoles.Remove(ur);
        }

        context.SaveChanges();
    }
}

当您致电UserRole时,您肯定会最终加载要删除的所有ToArray行,但这肯定比加载所有相关UserRole行。

相关问题