实体框架中的数据访问控制

时间:2012-04-20 16:21:36

标签: .net sql-server entity-framework view data-access

我想在Entity Framework中创建一个简单的(或不是)数据访问控制。我看到它在EF中不那么容易支持,因为EF实际上并不能很好地支持模式和视图。

我想对某些实体列进行条件访问。

在Sql Server中,使用模式很容易实现。例如,我可以在他的架构中为用户创建一个视图,其中缺少某些列。其他用户(例如admin)将在其架构中包含所有列。它们都可以具有相同的视图名称,例如:getUsers,但只有将从dbo架构执行它的管理员(dbo.getUsers)将包含所有列,而其他列只有一些。当然,在Sql Server中,它也可以通过存储过程来实现。

如何在EF中实现数据访问功能?

我想制作一个我可以这样使用的功能:

-- function checks user role and returns appropirate columns/entity  
var result = getAppropirateDataForThisUser("getUsers", user);

当然,这只是为了说明问题。用法可能完全不同。

2 个答案:

答案 0 :(得分:0)

您可以做的一件事是创建一个包装流动站DbContext,其逻辑用于过滤相关用户的列,

public class EfWrapper:Context
{
 private DbContext _dbContext;

public EfWrapper(DbContext context){
    _dbContext=context;
  }

  public IEnumerable <User> getUsers(User user){

         //if ... write your logic to choose correct projection 
          var users=  from user in context.Users
          select new UserWithLessColumns
               {
                    id= user.Id,
                    Name= user.Name
               });   
        return users;
 }
}

答案 1 :(得分:0)

条件过滤的目的是什么?如果是显示,请在上层应用层中处理。如果你实际上在谈论不同的业务对象(即,一个用户获得一种类型的对象,另一个用户获得该对象的子类型),那么你可以创建不同的类,并为这些类映射,并使用代码优先EF技术

EF是一个数据访问组件,具体来说就是一个对象关系映射器,即,它将数据库数据映射到业务对象,对吗?