Как организовать миграции Entity Framework Core (сначала кода) с двумя разными схемами баз данных в одном проекте? - PullRequest
0 голосов
/ 21 марта 2020

Итак, я создаю API в ASP. NET Core и хочу сначала использовать Entity Framework Core с кодом.

У меня проблема в том, что у меня есть две разные схемы базы данных (одна для базы данных каталога, содержащей всю информацию о клиенте, и одну для баз данных арендаторов, содержащих данные приложения каждого клиента). Мне трудно понять, как организовать миграцию.

Вот как я себе это представляю прямо сейчас:

  • Api Project : ASP. * Базовый проект 1037 *, содержащий контроллеры и создающий DbContexts, получая строки подключения из переменных среды, установленных в Azure.
  • Каталог проекта : Содержит основные бизнес-логи c вместе с постоянный код, поэтому код CatalogDbContext будет здесь вместе с его миграциями.
  • Проект арендаторов : содержит основные бизнес-логи c вместе с постоянным кодом, поэтому код TenantDbContext будет здесь вместе с его миграциями.
  • Общий проект : Содержит обобщенный код c, который можно повторно использовать как в каталоге, так и в проекте-арендаторе, например, интерфейс хранилища basi c и т. д. c.

Каталог CatalogDbContext будет создан в файле Startup.cs (проект Api), поскольку существует только один экземпляр этой базы данных, в то время как Ten Возможно, муравьи будут созданы в фильтре или контроллере в зависимости от токена пользовательского сеанса (мы получим соответствующую базу данных клиентов из базы данных каталога).

Теперь я также хочу использовать локальную базу данных, если я Я нахожусь в среде разработки, а не извлекаю строку подключения из переменных среды.

Что меня действительно смущает, так это то, как Entity Framework Core знает, где искать генерацию миграций? Например, если я создам экземпляр DbContext и свяжу его с поставщиком SqlServer только в контроллерах или в Startup.cs проекта Api, как он будет работать? Люди рекомендуют устанавливать строку подключения в методе OnConfiguring объекта DbContext, но я не хочу задавать строку подключения stati c в сборке Catalog / Tenants, я хочу получить эту информацию из переменных среды.

Так я должен передать строку подключения в качестве свойства или параметра конструктора DbContext и просто использовать это свойство в методе OnConfiguring?

Надеюсь, это имеет смысл. Спасибо!

1 Ответ

1 голос
/ 22 марта 2020

Вот демонстрационное мультитенантное приложение, которое я создал ранее, https://github.com/SamuelKoroh/AspNetCorePropertyPro

Внутри проекта AspNetCorePropertyPro.Data у меня есть как TenantDbContext, так и GlobalDbContext.

GlobalDbContext - это место, где я управляю настройками для арендаторов.

services.AddDbContext<GlobalDbContext>(c => 
  c.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

Здесь DefaultConnection задается для локальной базы данных в моей локальной переменной среды с использованием secret. json (Manager User Secret) во время работы (Azure Служба приложений) соединение по умолчанию, если оно указывает на azure мс SQL.

Проект AspNetCorePropertyPro.Data также содержит миграции для обоих DbContext.

Миграция арендатора Поместить в качестве дочернего каталога в папку миграций, созданную entityframework для достижения этого использования: do tnet ef migrations добавить {tenant -igration-name} -o Migrations / Tenants - c TenantDbContext -s ../AspNetCorePropertyPro.Api/ AspNetCorePropertyPro.Api.csproj

сделать tnet ef миграций добавить {имя-миграции} - c TenantDbConte xt -s ../AspNetCorePropertyPro.Api/AspNetCorePropertyPro.Api.csproj для запуска миграции на клиент.

do tnet ef обновление базы данных - c GlobalDbContext -s ../AspNetCorePropertyPro.Api/ AspNetCorePropertyPro.Api.csproj для запуска миграции в глобальном контексте

do tnet ef обновление базы данных - c GlobalDbContext -s ../AspNetCorePropertyPro.Api/AspNetCorePropertyPro.Api.csproj для запуска миграции в глобальный контекст context

-o = выходной каталог.

- c = dbcontext для выполнения миграции, если существует более одного.

-s = путь к стартовому проекту .

Примечание services.AddDbContext (); не ссылается ни на какие параметры базы данных во время разработки, это делается во время выполнения в зависимости от доступа клиента к системе.

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            var conn =  _tenant.ConnectionString;
            //var conn = @"Server=(localDB)\MSSqlLocalDB; database=TenantOne; Integrated Security=true";
            //optionsBuilder.UseSqlServer(conn);
            optionsBuilder.UseSqlServer(conn);
            base.OnConfiguring(optionsBuilder);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...