Решения для простого мультитенантного веб-приложения с структурой сущностей
Я разрабатываю мультитенантное веб-приложение (стек: MVC 4 + Entity Framework 4.3). Мои требования довольно просты: у каждого арендатора одинаковый интерфейс и кодовая база.
В моей базе данных у меня есть несколько таблиц с полем TenantId (и другие таблицы без).
Я создал очень простой общий репозиторий:
public class GenericRepository<TEntity> where TEntity : class
{
internal Database.CRMEntities context;
internal DbSet<TEntity> dbSet;
internal int tenantId;
public GenericRepository(Database.CRMEntities context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
this.tenantId = 1;
}
Я хотел бы получить "получить" методы фильтрации для моего tenantId. Мой метод вставки, обновления и удаления также должен ограничивать соответствующий TenantId.
Мои сущности являются автоматически сгенерированными классами POCO.
Я рассмотрел эти решения:
1- GenericRepository должен реализовывать «ITenant» интерфейс, который определяет TenantId. Проблема заключается в том, что некоторые объекты не получили свойство TenantId. Кроме того, мне не очень нравится изменять шаблон T4, который я использую для генерации объектов POCO, чтобы они реализовали мой интерфейс.
2- Отражение (но, конечно, EF не может перевести его в оператор SQL)
if (typeof(TEntity).GetProperty("TenantId") != null)
query = query.Where(x => (int) (x.GetType().GetProperty("TenantId").GetValue(x, null)) == tenantId);
Что бы вы сделали в моем случае? Я готов пересмотреть мою архитектуру, если это необходимо.
Спасибо, Никола