2011-02-27 36 views
4

我正在处理用户和权限模块,用于使用c#4.0和Entities Framework的一些项目。在EF中添加触发器

,并在提出的方案中,我必须给像数据用户权限:

  • 给予用户在特定部门的员工“约翰”的管理权限。

,所以我认为,以处理实体框架此权限,并添加所有选择查询条件,一些之前执行它,换句话说,我需要添加像在实体框架触发出头改变选择查询之前执行它。

有没有办法在实体框架中做到这一点?

回答

1

您可以动态添加多个条件到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的属性中,并动态添加处理安全性的查询部分。