開髮網站時,在後臺管理系統中,如果有多類角色,將會涉及到為角色分配用戶的功能,或者是為用戶選擇角色。為用戶分配角色相對來說操作的數據量比較小,因為系統所設定的角色不會有很多種。而如果是為角色分配用戶,操作的數據量就比較大。 資料庫表的設計 User_Role 需要修改角色對應的用戶時,即在界面上重新 ...
開髮網站時,在後臺管理系統中,如果有多類角色,將會涉及到為角色分配用戶的功能,或者是為用戶選擇角色。為用戶分配角色相對來說操作的數據量比較小,因為系統所設定的角色不會有很多種。而如果是為角色分配用戶,操作的數據量就比較大。
資料庫表的設計 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."}