Использование отдельного модуля миграций

Возможно, вам захочется хранить миграции в другом проекте, чем тот, который содержит ваши DbContext. Это рекомендуется, если в проекте используется тип проекта для конкретной платформы, например WinUI, Xamarin, MAUI, Blazor или Функции Azure, или если он предназначен для определенного идентификатора среды выполнения (RID). Эту стратегию можно также использовать для ведения нескольких наборов миграций, например, одного для разработки и другого для обновлений от выпуска к выпуску.

Подсказка

Вы можете просмотреть сample этой статьи на GitHub.

Этапы

  1. Создайте библиотеку классов.

  2. Добавьте ссылку на проект DbContext.

  3. Переместите файлы миграций и моментальных снимков модели в библиотеку классов.

    Подсказка

    Если у вас нет существующих миграций, создайте одну в проекте, содержащем DbContext, а затем переместите её. Это важно, так как если проект миграции не содержит существующей миграции, команда Add-Migration не сможет найти DbContext.

  4. Настройте модуль миграций:

    services.AddDbContext<ApplicationDbContext>(
        options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection"),
                x => x.MigrationsAssembly("WebApplication1.Migrations")));
    
  5. Добавьте ссылку на проект миграции из запускаемого проекта.

    <ItemGroup>
      <ProjectReference Include="..\WebApplication1.Migrations\WebApplication1.Migrations.csproj" />
    </ItemGroup>
    

    Если это приводит к циклической зависимости, можно обновить базовый выходной путь проекта миграции .

    <PropertyGroup>
      <BaseOutputPath>..\WebApplication1\bin\</BaseOutputPath>
    </PropertyGroup>
    

Если вы все сделали правильно, то сможете добавить новые миграции в проект.

dotnet ef migrations add NewMigration --project WebApplication1.Migrations

Подсказка

Если приложение использует внедрение зависимостей, рассмотрите возможность реализации IDesignTimeDbContextFactory<TContext> в проекте миграции. Это позволяет инструментам EF создавать ваши DbContext без необходимости запускать стартовый проект. Дополнительные сведения см. в разделе "Из фабрики проектирования".