我想在实体框架中创建一个简单(或不简单)的数据访问控制。我看到它在 EF 中并不容易得到支持,因为 EF 实际上没有对架构和视图的良好支持。
我想对实体的某些列进行条件访问。
在 Sql Server 中,使用架构很容易实现。例如,我可以在他的架构中为用户创建一个视图,其中缺少某些列。其他用户(例如管理员)将在其架构中拥有所有列。它们都可以具有相同的视图名称,例如:getUsers,但只有从dbo schema(dbo.getUsers)执行它的管理员才会拥有所有列,而其他列只有一些列。当然,在 Sql Server 中,它也可以通过存储过程来实现。
如何在 EF 中实现数据访问的功能?
我想创建一个函数,我将能够像这样使用:
-- function checks user role and returns appropirate columns/entity
var result = getAppropirateDataForThisUser("getUsers", user);
当然这只是为了说明问题。用法可能完全不同。
您可以做的一件事是创建一个包装器漫游车 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 技术
EF 是一个数据访问组件,具体来说是一个对象关系映射器,即,它将数据库数据映射到业务对象,对吗?