Мультитенантные Приложения с EF Core. Начало
Сегодня большинство программ основано на концепции мультитенантости, т.е. обслуживания нескольких клиентов, сохраняя при этом их данные изолированными. Это можно реализовать двумя способами:
1. Единая база данных и логическая изоляция,
2. Несколько баз данных и физическая изоляция.
1. Мультитенантость в единой базе данных
Для реализации мультитенантости понадобятся две вещи:
- Узнать текущего клиента,
- Отфильтровать данные только для этого клиента.
Типичный подход к мультитенантости в одной базе данных — наличие столбца TenantId в таблицах. А затем фильтрация по этому столбцу при запросе к базе данных. В EF Core мы можем использовать глобальный фильтр запросов. Внутри метода OnModelCreating мы настраиваем фильтр запросов для объекта Order:
public class OrdersContext : DbContext
{
private string _tenantId;
public OrdersContext(
DbContextOptions<OrdersContext> opt,
TenantProvider tp) : base(opt)
{
_tenantId = tp.TenantId;
}
protected override void
OnModelCreating(ModelBuilder mb)
{
mb.Entity<Order>
.HasQueryFilter(o =>
o.TenantId == _tenantId);
}
}
Мы используем класс TenantProvider для получения текущего клиента:
public class TenantProvider
{
private IHttpContexAccessor _hca;
public TenantProvider(IHttpContexAccessor hca)
{
_hca = hca;
}
public string TenantId => _hca
.HttpContext.Request.Headers["X-TenantId"];
}
В этом примере TenantId получается из заголовка HTTP-запроса. Также его можно извлекать из строки запроса, JWT Claim, ключа API и т.п. Последние два варианта более безопасны.
Окончание следует…
Источник: https://www.milanjovanovic.tech/blog/multi-tenant-applications-with-ef-core