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());
|
|
请发表评论