Используя EF Core, каков наиболее эффективный способ динамического переключения схем с использованием одного DbContext? - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть приложение с ~ 500 пользователями, и для обеспечения безопасности и разделения интересов мы используем отдельную схему для управления данными пользователя с таблицами, которые идентичны по структуре для всех. Я не могу создать новый класс dbcontext для каждого пользователя, и они являются динамическими c, поэтому мы создаем схему с помощью кода (который прекрасно работает). Недавно я выяснил, как использовать EF-миграции для схемы каждого пользователя, поэтому единственное, с чем я борюсь, - это динамическая замена схемы, на которую я буду указывать sh для каждого веб-запроса.

Сценарий очень похож на тот, который решает этот ответ (не выбранный ответ): { ссылка } Но этот вопрос был опубликован почти 4 года назад go, поэтому я ' Я не уверен, что этот ответ является наиболее эффективным или даже предлагаемым способом go об этом. Документы github направляют все вопросы в StackOverflow, поэтому я надеюсь, что в настоящее время существует обходной путь, позволяющий использовать все преимущества EF без необходимости создавать собственную реализацию целиком с нуля.

1 Ответ

2 голосов
/ 18 февраля 2020

Обычный способ выполнить sh - это использовать отдельные базы данных на пользователя / арендатора. Тогда вы можете просто изменить строку подключения, вместо того, чтобы иметь отдельные схемы в одной базе данных. Отдельные базы данных более безопасны, позволяют масштабировать на нескольких серверах и включают резервное копирование и восстановление для каждого клиента.

Ссылочный подход с использованием пользовательского ModelKeyCacheFactory для настройки и кэширования отдельной модели DbContext для каждый пользователь должен работать. Недостатком является то, что вы будете настраивать и кэшировать большое количество моделей, что не является бесплатным.

Но для использования схем у вас есть другой вариант. В EF Core 3.1 (по крайней мере), если вы не конфигурируете схему для сущности и не конфигурируете схему по умолчанию для DbContext, имена объектов не будут квалифицированы по схеме. Таким образом, вы можете использовать правила разрешения схемы вашей базы данных для направления запросов к правильной схеме. Например, в SQL Server вы бы предоставили отдельного пользователя базы данных для каждого арендатора с разрешениями на схему этого арендатора и со схемой арендатора, настроенной как схема пользователя по умолчанию.

Вы также могли бы потенциально использовать Перехват запросов для перезаписи запросов после настройки DbContext для вставки некоторого легко заменяемого токена в качестве имени схемы.

...