为用户分配角色 C#

开发网站时,在后台管理系统中,如果有多类角色,将会涉及到为角色分配用户的功能,或者是为用户选择角色。为用户分配角色相对来说操作的数据量比较小,因为系统所设定的角色不会有很多种。而如果是为角色分配用户,操作的数据量就比较大。

数据库表的设计 User_Role

UserID RoleID
1 1
1 2
1 3

需要修改角色对应的用户时,即在界面上重新勾选相应的用户,然后再保存,最开始采取的做法先删除该类角色对应的所有用户,然后在插入本次保存的用户ID。这种做法的效率很低。因为大多数情况下只是对某类角色下的个别用户进行添加或者删除。

把第一次存入User_Role表的所有UserID设为集合A,把修改后用户所勾选的所有用户的UserID设为集合B

   

             图一

大部分情况下,是如下图所示

            图二

可能也会出现,原有的用户全部保留,又新添加一批用户。或者是在原有用户的基础上删除一些用户、分别如图三和图四所示

          图三                                                                                          图四

public static async Task UpdateUsersOfRole(int roleid,IEnumerable<int> originuserids,IEnumerable<int> nowuserids)
        {
            if (null == nowuserids)
                nowuserids = new int[] { };
            if (null == originuserids)
                originuserids = new int[] { };
            using (MasonDB db = new MasonDB())
            {
                var deletelist = originuserids.Except(nowuserids);
                if (deletelist.Count() > 0)
                { 
                    var todelete = deletelist.Select(urm => new User_Role { UserID = urm, RoleID = roleid }).ToArray();
                    //db.Entry(todelete).State = EntityState.Deleted;
                    foreach(var d in todelete)
                        db.Entry(d).State = EntityState.Deleted;
                    db.User_Role_Mappings.RemoveRange(todelete); 
                }
                var addlist = nowuserids.Except(originuserids);
                if(addlist.Count() > 0)
                    db.User_Role_Mappings.AddRange(addlist.Select(urm => new User_Role { UserID = urm, RoleID = roleid }).ToArray()
                    );
                await db.SaveChangesAsync();
            }        
        }

如果不加

foreach(var d in todelete)
   db.Entry(d).State = EntityState.Deleted;

会提示错误{"The object cannot be deleted because it was not found in the ObjectStateManager."}

原文地址:https://www.cnblogs.com/sMKing/p/5431786.html