2012-04-20 3 views
1

Я хочу сделать простой (или нет) контроль доступа к данным в 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); 

Конечно, это только для иллюстрации проблемы. Использование может быть совершенно иным.

ответ

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

Это может быть очень тяжелая работа с этим, когда у меня есть много объектов/представлений/процедур. Разве нет более простого решения? Реализация методов для каждого объекта может быть плохой идеей. Я предпочел бы фильтровать столбцы на сайте БД с помощью хранимой процедуры или представления ... – nosbor

+0

В таком случае .. да. Я думаю, вам нужно это в стороне базы данных. –

+0

Хорошо, но как я могу справиться с этим в EF? Я попытался сделать это с помощью db.ExecuteStoreQuery (@ "выполнить" + схему + "." + ProcName); но когда я выполняю процедуру из схемы, где я получил меньше столбцов, тогда EF исключает исключение, что для этого приведения недостаточно столбцов ... – nosbor

0

Какова цель условной фильтрации? Если это для отображения, обработайте это в верхних слоях приложений. Если вы действительно говорите о разных бизнес-объектах (т. Е. Один пользователь получает один тип объекта, другой пользователь получает подтип этого объекта), то вы можете создавать разные классы и карты для этих классов и использовать первый код EF

EF - это компонент доступа к данным, в частности, объект Relational Mapper, то есть он отображает данные базы данных в бизнес-объекты, не так ли?

+0

Да, вы правильно поняли. Есть ли у вас какие-либо предложения, как я могу это достичь? – nosbor

+0

Так вы пытаетесь разоблачить различные бизнес-объекты или отобразить фильтр? –