標籤:
1. 典型應用情境1.1. EF資料存放區
EF的核心是資料內容DbContext,它提供了基本的資料存放區操作方法。
1.1.1. 新增
採用添加對象的方式。
//建立許可權 var permission = new ApplicationPermission { Id = item.Id, Action = item.Action, Controller = item.Controller, Description = item.Description }; _db.Permissions.Add(permission); //儲存 await _db.SaveChangesAsync(); |
1.1.2. 修改
採用修改實體狀態的方式。
_db.Entry(applicationPermission).State = EntityState.Modified; _db.SaveChanges(); |
1.1.3. 刪除
採用移除對象的方式。
ApplicationPermission applicationPermission = _db.Permissions.Find(id); _db.Permissions.Remove(applicationPermission); _db.SaveChanges(); |
採用修改實體狀態的方式。
//刪除Permission var entity = new ApplicationRolePermission { RoleId = roleId, PermissionId = permissionId }; _db.Set<ApplicationRolePermission>().Attach(entity); _db.Entry(entity).State = EntityState.Deleted; var result = await _db.SaveChangesAsync(); |
1.1.4. 查詢
樣本項目中的部分代碼。
//取資料內容 var context = HttpContext.Current.GetOwinContext().Get<ApplicationDbContext>(); //取角色 var role = context.Roles.Include(r => r.Permissions).FirstOrDefault(t => t.Id == roleId); //取許可權ID列表 var rolePermissionIds = role.Permissions.Select(t => t.PermissionId); //取許可權列表 permissions = context.Permissions.Where(p => rolePermissionIds.Contains(p.Id)).ToList(); var permissions = await _db.Permissions.ToListAsync(); ApplicationPermission applicationPermission = _db.Permissions.Find(id); |
1.2. 自訂比較子1.2.1. 相等比較IEqualityComparer
ApplicationPermission對象是否相等需要依次比較Controller、Action和Description,屬於自訂規則,為此比較子要實現相等比較介面IEqualityComparer。
public class ApplicationPermissionEqualityComparer : IEqualityComparer<ApplicationPermission> { public bool Equals(ApplicationPermission x, ApplicationPermission y) { //先比較ID if (string.Compare(x.Id, y.Id, true) == 0) { return true; } //而後比較Controller,Action,Description和Params if (x.Controller == y.Controller || x.Action == y.Action || x.Description == y.Description ) { return true; } else { return false; } } public int GetHashCode(ApplicationPermission obj) { var str = string.Format("{0}-{1}-{2}", obj.Controller, obj.Action, obj.Description); return str.GetHashCode(); } } |
在Contains中使用比較子。
//是否授權 if (rolePermissions.Contains(action, new ApplicationPermissionEqualityComparer())) { return true; } else { return false; } |
在Except中使用比較子。
//取程式集中許可權 var allPermissions = _permissionsOfAssembly; //取資料庫已有許可權 var dbPermissions = _db.Permissions.ToList(); //取兩者差集 var permissions = allPermissions.Except(dbPermissions, new ApplicationPermissionEqualityComparer()); |
1.2.2. 大小比較IComparer
PermissionViewModel需要按Controller、Action進行排序,屬於自訂規則,為此比較子要實現大小比較介面IComparer。
public class PermissionViewModelComparer : IComparer<PermissionViewModel> { public int Compare(PermissionViewModel x, PermissionViewModel y) { //id相同,則相等 if (string.Compare(x.Id, y.Id, true) == 0) { return 0; } //controller比較 var controllerCompareResult = string.Compare(x.Controller, y.Controller, true); //action比較 var actionCompareResult = string.Compare(x.Action, y.Action, true); //先比較controller,後比較action if (controllerCompareResult != 0) { return controllerCompareResult; } else { return actionCompareResult; } } } |
使用比較子。
//排序 permissionViews.Sort(new PermissionViewModelComparer()); |
ASP.NET Identity “角色-許可權”管理 8