Entity Framework Core Row Level Security с использованием SESSION_CONTEXT
Я пишу мультитенантное приложение с использованием Row Level Security, использующее ASP.NET Core и Entity Framework 7 (Core). Поскольку моя база данных размещена на Microsoft SQL Server, я использовалэтот метод для обеспечения соблюдения RLS.
Теперь все, что мне нужно, это установить желаемый tenant_id в SESSION_CONTEXT.
Первой проблемой, с которой я столкнулся, было выполнение хранимой процедуры с использованием EF7. Решение, кажется, будет:
var resp = context.Set<SessionVars>().FromSql(
"EXECUTE sp_set_session_context @key = N'my_tenant', @value = {0};
SELECT * FROM mySessionVars", desiredTenant).ToList();
Используя приведенную выше команду, я ясно вижу, что SESSION_CONTEXT успешно установлен. Теперь я ожидаю увидеть, что следующие запросы в том же контексте фильтруются в соответствии с клиентом, который я установил в SESSION_CONTEXT.
int visibleRows = context.MyModel.ToList().Count;
К сожалению, результаты не такие, как ожидалось. Он ведет себя так, как будто строки были получены до того, как был установлен SESSION_CONTEXT.
Это вызвано нетерпеливой загрузкой EF7? EF7 использует обналиченные данные? Как я могу преодолеть это?
Я ожидаю, что смогу установить любое значение, которое я хочу, для SESSION_CONTEXT, и это будет удерживаться в контексте до тех пор, пока не будет изменено или пока соединение не будет закрыто.