【问题标题】:data access control in entity framework实体框架中的数据访问控制
【发布时间】:2012-05-02 06:06:26
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以做的一件事是创建一个包装器 rover 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;
     }
    }
    

    【讨论】:

    • 当我有很多实体/视图/程序时,使用它可能会非常困难。没有更简单的解决方案吗?为每个对象实现方法可能是个坏主意。我宁愿通过存储过程或视图过滤数据库站点上的列...
    • 在那种情况下.. 是的。我认为您需要在数据库方面使用它。
    • 好的,但是如何在 EF 中处理它?我试图通过 db.ExecuteStoreQuery(@"execute " + schema + "." + procName);但是当我从接收到较少列的架构中执行过程时,EF 会抛出异常,即没有足够的列来执行此转换...
    【解决方案2】:

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

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

    【讨论】:

    • 是的,你理解正确。你有什么建议我该如何实现?
    • 那么你是想暴露不同的业务对象,还是过滤显示?
    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多