zoukankan      html  css  js  c++  java
  • 为用户分配角色 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."}

  • 相关阅读:
    C-Scanf连续调用多次并且存在%c的问题
    JavaScript-常用正则函数(适合忘记时看)
    JavaScript-深入理解JavaScript(一、预编译和执行过程)
    Python-代码性能优化技巧
    Python-深入理解元类(metaclass)
    Python-编码之大彻大悟
    Python-正确使用Unicode
    Fiddler-抓取安卓手机APP请求地址
    unity, access sprite of UGUI Image
    unity, UGUI Text outline
  • 原文地址:https://www.cnblogs.com/sMKing/p/5431786.html
Copyright © 2011-2022 走看看