Entity Framework для мультитенантной архитектуры - фильтрация одной таблицы по идентификатору клиента - PullRequest
7 голосов
/ 06 марта 2012

Мы ищем способ автоматической фильтрации всех операций CRUD по идентификатору клиента в Entity Framework.

Мы подумали:

  • Использование определяемого пользователем табличного значенияfunctions
  • Использование хранимых процедур (но мы на самом деле этого не хотим, поскольку мы используем ORM, чтобы избежать этого)
  • Как изменить шаблоны, используемые для генерации SQL, для добавленияПредложение where для каждого оператора.
  • Как изменить шаблоны, используемые для генерации LINQ в контроллерах (мы можем использовать MVC).

Любые советы?

-Спасибо Алекс.

Ответы [ 2 ]

13 голосов
/ 06 марта 2012

Использование пользовательских функций с табличным значением

Функция с табличным значением доступна только в .NET 4.5 Beta (и сначала недоступна в коде).Их использование по-прежнему не поможет, потому что вам придется использовать функцию в каждом запросе LINQ, так что это то же самое, что и при использовании условия where.

Использование хранимых процедур (но мы на самом деле не хотим, поскольку мы используем ORM, чтобы избежать этого)

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

Некоторые способы изменения шаблонов, используемых для генерации SQL, для добавления предложения where к каждому оператору.

Слишком сложный и совершенно другой уровень абстракции.

Как изменить шаблоны, используемые для генерации LINQ в контроллерах (мы можем использовать MVC).

Близко к идеальному решению.Вам просто нужно обернуть доступ к вашему набору сущностей в некоторый код, который будет выглядеть следующим образом:

public class MultiTenantAccess<T> where T : IMultitenant
{
    private IDbSet<T> set;  

    ... 

    public IQueryable<T> GetQuery(int tenantID) 
    {
        return set.Where(e => e.TenantID == tenantID); 
    }
}

Иногда это ядро ​​для чего-то, называемого универсальным репозиторием, но на самом деле это просто оболочка для набора EF.Вы всегда будете использовать GetQuery для запроса вашего хранилища данных вместо использования DbSet напрямую.

3 голосов
/ 03 июня 2013

вы также можете разделить данные об арендаторах в разные базы данных
или в одну базу данных, но с разными схемами? Подробнее об этом можно прочитать в старой статье MSDN под названием « Мультитенантная архитектура данных »

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