我正在使用c#4.0和Entities Framework处理一些项目的用户和权限模块.
在提议的场景中,我必须授予用户以下数据的权限:
>为特定部门的员工授予用户“John”管理权限.
所以我想在Entity Framework中处理这个权限,并在执行之前在所有选择查询中添加一些条件,换句话说,我需要在执行它之前添加像实体框架中的触发器之类的东西来改变选择查询.
在实体框架中有没有办法做到这一点?
解决方法
您可以动态地向IQueryable添加多个条件.所以你可以这样做:
[PrincipalPermission(SecurityAction.Demand,Role="DepartmentManager")] public IEnumerable<Employee> GetManagedEmployees() { // build base query var query = from e in context.Employees select e; // add condition query = AddDepartmentPermissions(query); return query.AsEnumerable(); }
你的AddDepartmentPermissions看起来像:
private IQueryable<Employee> AddDepartmentPermission(IQueryable<Employee> query) { int departmentId = GetAllowedDepartmentSomewhere(); return query.Where(e => e.Department.Id == departmentId); }
这只是一个示例,其中PrincipalPermission不允许为非管理员角色调用GetManagedEmployees,AddDepartmentPermission仅为允许部门的选择员工添加查询部分.
重点是你可以包装IQueryable< T>到将修改查询的方法.我相信甚至可以将拦截(方面)直接添加到暴露ObjectSet的属性并动态添加处理安全性的查询部分.