Перехватчик запросов в Entity Framework без использования служб данных WCF - PullRequest
1 голос
/ 11 октября 2011

Я использую EF 4.1 Code First.Я НЕ хочу пользоваться услугами WCF Data.Могу ли я реализовать перехватчик запросов?Любые указатели по этому поводу будут высоко оценены.Спасибо!

1 Ответ

3 голосов
/ 11 октября 2011

Нет, EF вообще не предлагает перехватчиков запросов. Это чисто дополнение служб данных WCF. Вы должны реализовать свою собственную инфраструктуру для такой логики, но у меня есть некоторые сомнения, что это выполнимо на глобальном уровне.

Вы можете сделать что-то подобное в вашем контексте:

public IQueryable<Client> ClientsQuery(IPrincipal principal)
{
    if (prinicipal.IsInRole("Admin") 
    {
        return this.Clients;
    } 
    else
    {
        return this.Clients.Where(...);
    }
}

Ну, это не очень хорошо, потому что оно перемещает бизнес-логику на уровень доступа к данным и жестко закодировано. Большая проблема в том, что он работает, только если вы используете ClientsQuery в верхнем слое вместо Clients напрямую. Еще хуже то, что он работает только для прямых запросов, но не для отношений. Поэтому, если у вас есть, например, сущность Product, содержащая свойство навигации для всех клиентов, которые когда-либо покупали продукт, это свойство навигации никогда не будет фильтроваться по вашему условию, поскольку EF вообще не поддерживает фильтрацию свойств навигации.

Нет общего решения этой проблемы. Ваша бизнес-логика должна обрабатывать это, добавляя правильные условия там, где это необходимо, и используя проекции в случае фильтрации свойств навигации, таких как:

var query = from p in context.Products
            where ...
            select new 
                {
                    Name = p.Name,
                    Clients = p.Clients.Where(...)
                };

Btw. Свойства навигации также не определяются службами данных WCF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...