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

.net 实体框架中的数据访问控制,.net,sql-server,entity-framework,view,data-access,.net,Sql Server,Entity Framework,View,Data Access,我想在实体框架中做一个简单(或不简单)的数据访问控制。我发现它在EF中不太容易被支持,因为EF实际上对模式和视图没有很好的支持 我想对实体的某些列进行条件访问 在SQLServer中,使用模式很容易实现。例如,我可以在用户的模式中为缺少某些列的用户创建一个视图。其他用户(例如admin)将拥有其模式中的所有列。它们都可以具有相同的视图名称,例如:getUsers,但只有将从dbo模式(dbo.getUsers)执行该视图的管理员才能拥有所有列,而其他管理员只能拥有部分列。当然,在Sql Serv

我想在实体框架中做一个简单(或不简单)的数据访问控制。我发现它在EF中不太容易被支持,因为EF实际上对模式和视图没有很好的支持

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

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

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

我想做一个函数,我可以这样使用:

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

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

您可以做的一件事是使用逻辑创建一个包装器,以过滤相关用户的列

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;
 }
}
公共类EfWrapper:上下文
{
私有DbContext _DbContext;
公共EfWrapper(DbContext上下文){
_dbContext=context;
}
公共IEnumerable getUsers(用户用户){
//如果…写下你的逻辑来选择正确的投影
var users=来自上下文中的用户。users
选择新用户WithlessColumns
{
id=user.id,
Name=user.Name
});   
返回用户;
}
}

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


EF是一个数据访问组件,特别是一个对象关系映射器,即它将数据库数据映射到业务对象,对吗?

当我有许多实体/视图/过程时,使用它可能会非常困难。难道没有更简单的解决办法吗?为每个对象实现方法可能是个坏主意。我宁愿按存储过程或视图过滤DB站点上的列…在这种情况下。。对我想你需要在数据库端处理它。好的,但是我如何在EF中处理它呢?我试图通过db.ExecuteStoreQuery(@“execute”+schema+“+procName”)来实现这一点;但当我从接收到的列较少的模式执行过程时,EF抛出异常,即并没有足够的列来执行此转换…是的,您理解正确。您对如何实现这一点有什么建议吗?那么您是在尝试公开不同的业务对象,还是筛选显示?