2012-04-20 47 views
1

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

我想有条件地访问一些实体的列。

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

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

我要让我将能够使用这样的功能:当然

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

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

回答

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; 
} 
} 
+0

当我有很多实体/视图/过程时,可能很难处理。没有更简单的解决方案吗?为每个对象实现方法可能是个坏主意。我宁愿过滤存储过程或视图在DB网站上的列... – nosbor 2012-04-20 16:47:23

+0

在这种情况下..是的。我认为你需要在数据库方面。 – 2012-04-20 16:50:00

+0

好的,但我如何在EF中处理它?我试图通过db.ExecuteStoreQuery (@“execute”+ schema +“。”+ procName)来完成它。但是当我从模式中执行过程时,我收到较少的列,然后EF抛出异常,没有足够的列来执行此操作... – nosbor 2012-04-20 17:05:57

0

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

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

+0

是的,你理解正确。你有什么建议,我怎么能做到这一点? – nosbor 2012-04-22 14:32:43

+0

那么你试图公开不同的业务对象,或过滤器显示? – 2012-04-23 18:20:51