Миграции EF Core с несколькими DbContexts в одной базе данных

  • Михаил
  • 8 мин. на прочтение
  • 29
  • 16 Oct 2024
  • 16 Oct 2024

В Entity Framework (EF) Core вы можете использовать миграции для управления изменениями в схеме вашей базы данных. Если у вас есть несколько DbContextэкземпляров, которые сопоставляются с одной и той же базой данных, вы все равно можете использовать миграции для управления изменениями в схеме для всех ваших DbContextэкземпляров.

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

  • Создайте отдельный проект миграции для каждого DbContextэкземпляра. Например, вы можете создать MyApp.Data.Context1.Migrationsпроект и MyApp.Data.Context2.Migrationsпроект.
  • В каждом проекте миграции добавьте ссылку на основной проект данных, содержащий DbContextклассы.
  • В каждом проекте миграции добавьте ссылку на Microsoft.EntityFrameworkCore.Designпакет.
  • В каждом проекте миграции добавьте ссылку на DbContextкласс, для которого вы хотите управлять миграциями. Например, в MyApp.Data.Context1.Migrationsпроекте добавьте ссылку на MyApp.Data.Context1пространство имен.
  • В каждом проекте миграции создайте DbContextFactoryкласс, который наследует интерфейс IDesignTimeDbContextFactory. В CreateDbContextметоде этого класса создайте DbContextэкземпляр, для которого вы хотите управлять миграциями.
public class Context1DesignTimeDbContextFactory : IDesignTimeDbContextFactory<Context1>
{
    public Context1 CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<Context1>();
        optionsBuilder.UseSqlServer("your connection string here");

        return new Context1(optionsBuilder.Options);
    }
}
  • В каждом проекте миграции добавьте миграцию с помощью dotnet ef migrations addкоманды, указав DbContextFactoryкласс и имя миграции.
dotnet ef migrations add MyMigration --context Context1 --project MyApp.Data.Context1.Migrations --startup-project MyApp.Web
  • Запустите dotnet ef database updateкоманду, чтобы применить миграцию к базе данных.
dotnet ef database update --context Context1 --project MyApp.Data.Context1.Migrations --startup-project MyApp.Web

Выполнив эти шаги, вы сможете управлять миграциями для нескольких DbContextэкземпляров, которые отображаются в одной и той же базе данных. Повторите те же шаги для каждого DbContextэкземпляра, для которого вы хотите управлять миграциями. Обратите внимание, что вам нужно будет указать соответствующий DbContextпроект миграции при запуске dotnet efкоманд.

Примеры
1. Поисковый запрос : «Миграции нескольких DbContexts в EF Core»

  • Пользователи могут искать информацию о том, как обрабатывать миграции при работе с несколькими DbContexts в Entity Framework Core.
# Пример кода Реализация 
dotnet ef migrations add InitialCreate --context FirstDbContext
dotnet ef migrations add AnotherMigration --context SecondDbContext

Описание : Этот код демонстрирует, как создавать миграции для каждого DbContext отдельно, указывая контекст с помощью --contextпараметра при запуске dotnet ef migrations addкоманды.

2. Поисковый запрос : «Скрипт миграции нескольких DbContexts EF Core»

  •  Пользователи могут быть заинтересованы в создании сценариев миграции для нескольких DbContexts в Entity Framework Core.
# Пример кода Реализация 
dotnet ef migrations script --output script.sql --context FirstDbContext
dotnet ef migrations script --output script.sql --context SecondDbContext

Описание : Этот код генерирует скрипты миграции SQL для каждого DbContext отдельно, используя --contextопцию с dotnet ef migrations scriptкомандой.

3. Поисковый запрос : «Миграции EF Core с несколькими DbContexts в ASP.NET Core»

  •  Пользователи могут быть особенно заинтересованы в обработке миграций с несколькими DbContexts в приложениях ASP.NET Core.
// Пример реализации кода 
services.AddDbContext<FirstDbContext>(options =>
   options.UseSqlServer(Configuration.GetConnectionString("FirstDbContext")));
services.AddDbContext<SecondDbContext>(options =>
   options.UseSqlServer(Configuration.GetConnectionString("SecondDbContext")));

Описание : Этот код настраивает несколько DbContexts в приложении ASP.NET Core, каждый со своей строкой подключения, указанной в appsettings.jsonфайле.

4. Поисковый запрос : «EF Core мигрирует несколько DbContexts в одной сборке»

  • Пользователи могут захотеть узнать, как управлять миграциями для нескольких DbContexts, расположенных в одной сборке в Entity Framework Core.
// Пример реализации кода 
dotnet ef migrations add InitialCreate --context FirstDbContext --project YourProjectName
dotnet ef migrations add AnotherMigration --context SecondDbContext --project YourProjectName

Описание : Этот код генерирует миграции для нескольких DbContexts, расположенных в одном проекте, путем указания имени проекта с помощью --projectпараметра.

5. Поисковый запрос : «EF Core отдельные миграции для каждого DbContext»

  • Пользователи могут быть заинтересованы в создании отдельных файлов миграции для каждого DbContext в Entity Framework Core.
// Пример реализации кода 
dotnet ef migrations add InitialCreate --context FirstDbContext
dotnet ef migrations add AnotherMigration --context SecondDbContext

Описание : Этот код генерирует отдельные файлы миграции для каждого DbContext, указывая контекст с помощью --contextопции с dotnet ef migrations addкомандой.

6. Поисковый запрос : «Миграции EF Core с несколькими DbContexts update-database»

  • Пользователи могут искать информацию о том, как применять миграции к нескольким DbContexts с помощью update-databaseкоманды в Entity Framework Core.
// Пример реализации кода 
dotnet ef database update --context FirstDbContext
dotnet ef database update --context SecondDbContext

Описание : Этот код применяет миграции к каждому DbContext отдельно, используя --contextопцию с dotnet ef database updateкомандой.

7. Поисковый запрос : «EF Core выполняет миграцию нескольких DbContexts в одну и ту же базу данных»

  •  Пользователи могут захотеть узнать, как работать с несколькими DbContexts, ориентированными на одну и ту же базу данных в Entity Framework Core.
// Пример реализации кода modelBuilder.Entity 
modelBuilder.Entity<Entity>().ToTable("Entities", schema: "first");
modelBuilder.Entity<AnotherEntity>().ToTable("AnotherEntities", schema: "second");

Описание : Этот код настраивает разные таблицы для сущностей из разных DbContexts, указывая разные схемы для каждой таблицы.

8. Поисковый запрос : «Миграции EF Core для нескольких DbContexts в библиотеке классов»

  • Пользователи могут быть заинтересованы в управлении миграциями для нескольких DbContexts в проекте библиотеки классов в Entity Framework Core.
// Пример реализации кода 
dotnet ef migrations add InitialCreate --context FirstDbContext --startup-project YourStartupProject
dotnet ef migrations add AnotherMigration --context SecondDbContext --startup-project YourStartupProject

Описание : Этот код генерирует миграции для нескольких DbContexts в проекте библиотеки классов, указывая стартовый проект с помощью --startup-projectпараметра.

9. Поисковый запрос : «EF Core миграции добавить-миграция с несколькими DbContexts»

  •  Пользователи могут искать информацию о том, как использовать add-migrationкоманду с несколькими DbContexts в Entity Framework Core.
// Пример реализации кода 
dotnet ef migrations add InitialCreate --context FirstDbContext
dotnet ef migrations add AnotherMigration --context SecondDbContext

Описание : Этот код генерирует миграции для каждого DbContext отдельно, указывая контекст с помощью --contextопции с dotnet ef migrations addкомандой.

10. Поисковый запрос : «EF Core выполняет миграцию нескольких DbContexts в одну базу данных»

  • Пользователи могут захотеть узнать, как управлять миграциями для нескольких DbContexts, ориентированных на одну базу данных в Entity Framework Core.
// Пример реализации кода modelBuilder.Entity 
modelBuilder.Entity<Entity>().ToTable("Entities", schema: "first");
modelBuilder.Entity<AnotherEntity>().ToTable("AnotherEntities", schema: "second");

Описание : Этот код настраивает разные схемы для сущностей из разных DbContexts, чтобы гарантировать их хранение в разных таблицах в одной и той же базе данных.