移行の適用Applying Migrations

移行を追加したら、それらをデプロイしてデータベースに適用する必要があります。Once your migrations have been added, they need to be deployed and applied to your databases. これを行うためのさまざまな方法があります。運用環境に適しているものと、開発ライフサイクルのものがあります。There are various strategies for doing this, with some being more appropriate for production environments, and others for the development lifecycle.

注意

配置戦略にかかわらず、実稼働データベースに適用する前に、生成された移行を常に検査してテストします。Whatever your deployment strategy, always inspect the generated migrations and test them before applying to a production database. 移行では、列の名前を変更しようとしたとき、またはデータベースに適用するさまざまな理由で失敗する場合があります。A migration may drop a column when the intent was to rename it, or may fail for various reasons when applied to a database.

SQL スクリプトSQL scripts

運用データベースへの移行を展開するには、SQL スクリプトを生成することをお勧めします。The recommended way to deploy migrations to a production database is by generating SQL scripts. この方法には、次のような利点があります。The advantages of this strategy include the following:

  • SQL スクリプトの精度を確認できます。これは、実稼働データベースにスキーマの変更を適用すると、データの損失を伴う可能性がある危険性の高い操作であるため、重要です。SQL scripts can be reviewed for accuracy; this is important since applying schema changes to production databases is a potentially dangerous operation that could involve data loss.
  • 場合によっては、実稼働データベースの特定のニーズに合わせてスクリプトをチューニングできます。In some cases, the scripts can be tuned to fit the specific needs of a production database.
  • SQL スクリプトは、配置テクノロジと組み合わせて使用することも、CI プロセスの一部として生成することもできます。SQL scripts can be used in conjunction with a deployment technology, and can even be generated as part of your CI process.
  • SQL スクリプトは DBA に提供でき、個別に管理およびアーカイブできます。SQL scripts can be provided to a DBA, and can be managed and archived separately.

基本的な使用方法Basic Usage

次の例では、空のデータベースから最新の移行に SQL スクリプトを生成します。The following generates a SQL script from a blank database to the latest migration:

dotnet ef migrations script

From を使用する (暗黙的な指定に対して)With From (to implied)

次の例では、指定された移行から最新の移行までの SQL スクリプトを生成します。The following generates a SQL script from the given migration to the latest migration.

dotnet ef migrations script AddNewTables

From および To を使用するWith From and To

次のは、指定された移行から指定された移行に SQL スクリプトを生成し from to ます。The following generates a SQL script from the specified from migration to the specified to migration.

dotnet ef migrations script AddNewTables AddAuditTable

ロールバック スクリプトを生成するために、to より新しい from を使用することができます。You can use a from that is newer than the to in order to generate a rollback script.

警告

データ損失の可能性のあるシナリオには注意してください。Please take note of potential data loss scenarios.

スクリプトの生成では、次の2つの引数を使用して、どの移行範囲を生成する必要があるかを示すことができます。Script generation accepts the following two arguments to indicate which range of migrations should be generated:

  • from 移行は、スクリプトの実行前にデータベースに適用される最後の移行にする必要があります。The from migration should be the last migration applied to the database before running the script. 移行が適用されていない場合、0 を指定します (これは既定です)。If no migrations have been applied, specify 0 (this is the default).
  • to 移行は、スクリプトの実行後にデータベースに適用される最後の移行です。The to migration is the last migration that will be applied to the database after running the script. これは既定でプロジェクトの最後の移行になります。This defaults to the last migration in your project.

べき等 SQL スクリプトIdempotent SQL scripts

上記で生成した SQL スクリプトは、ある移行から別の移行にスキーマを変更する場合にのみ適用できます。スクリプトは適切に適用する必要があり、適切な移行状態のデータベースのみに適用することをお勧めします。The SQL scripts generated above can only be applied to change your schema from one migration to another; it is your responsibility to apply the script appropriately, and only to database in the correct migration state. EF Core では、 べき等 スクリプトの生成もサポートしています。このスクリプトでは、(移行履歴テーブルを使用して) 既に適用されている移行を内部で確認し、不足しているもののみを適用しますEF Core also supports generating idempotent scripts, which internally check which migrations have already been applied (via the migrations history table), and only apply missing ones. これは、データベースに最後に適用された移行の内容を正確に把握していない場合、またはそれぞれが異なる移行に配置されている複数のデータベースに配置する場合に便利です。This is useful if you don't exactly know what the last migration applied to the database was, or if you are deploying to multiple databases that may each be at a different migration.

次の例では、べき等移行が生成されます。The following generates idempotent migrations:

dotnet ef migrations script --idempotent

コマンドライン ツールCommand-line tools

EF コマンドラインツールを使用すると、データベースに移行を適用できます。The EF command-line tools can be used to apply migrations to a database. 移行のローカル開発とテストの生産性を維持しながら、この方法は運用データベースの管理には適していません。While productive for local development and testing of migrations, this approach isn't ideal for managing production databases:

  • SQL コマンドはツールによって直接適用されます。開発者はこのコマンドを検査または変更することはできません。The SQL commands are applied directly by the tool, without giving the developer a chance to inspect or modify them. これは、運用環境では危険である可能性があります。This can be dangerous in a production environment.
  • .NET SDK と EF ツールは、実稼働サーバーにインストールする必要があります。The .NET SDK and the EF tool must be installed on production servers.

次の例では、データベースを最新の移行に更新します。The following updates your database to the latest migration:

dotnet ef database update

次の例では、指定された移行にデータベースを更新します。The following updates your database to a given migration:

dotnet ef database update AddNewTables

これは、以前の移行にもロールバックするために使用できることに注意してください。Note that this can be used to roll back to an earlier migration as well.

警告

データ損失の可能性のあるシナリオには注意してください。Please take note of potential data loss scenarios.

コマンドラインツールを使用した移行の適用の詳細については、「 EF Core ツールリファレンス」を参照してください。For more information on applying migrations via the command-line tools, see the EF Core tools reference.

実行時に移行を適用するApply migrations at runtime

アプリケーション自体が、通常は起動時にプログラムを使用して移行を適用できる可能性があります。It's possible for the application itself to apply migrations programmatically, typically during startup. 移行のローカル開発とテストの生産性を維持しながら、次のような理由から、この方法は実稼働データベースの管理には適していません。While productive for local development and testing of migrations, this approach is inappropriate for managing production databases, for the following reasons:

  • アプリケーションの複数のインスタンスが実行されている場合、両方のアプリケーションが移行を同時に適用して失敗する (または、データの破損の原因となる) ことがあります。If multiple instances of your application are running, both applications could attempt to apply the migration concurrently and fail (or worse, cause data corruption).
  • 同様に、別のアプリケーションが移行している間にアプリケーションがデータベースにアクセスしている場合は、重大な問題が発生する可能性があります。Similarly, if an application is accessing the database while another application migrates it, this can cause severe issues.
  • データベーススキーマを変更するには、アプリケーションに昇格されたアクセス権が必要です。The application must have elevated access to modify the database schema. 一般に、運用環境でアプリケーションのデータベースのアクセス許可を制限することをお勧めします。It's generally good practice to limit the application's database permissions in production.
  • 問題が発生した場合は、適用された移行をロールバックできることが重要です。It's important to be able to roll back an applied migration in case of an issue. その他の戦略では、簡単にそのまま使用できます。The other strategies provide this easily and out of the box.
  • SQL コマンドはプログラムによって直接適用されるので、開発者はそれを検査または変更することはできません。The SQL commands are applied directly by the program, without giving the developer a chance to inspect or modify them. これは、運用環境では危険である可能性があります。This can be dangerous in a production environment.

プログラムによって移行を適用するには、を呼び出し context.Database.Migrate() ます。To apply migrations programmatically, call context.Database.Migrate(). たとえば、一般的な ASP.NET アプリケーションでは、次の操作を実行できます。For example, a typical ASP.NET application can do the following:

public static void Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    using (var scope = host.Services.CreateScope())
    {
        var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
        db.Database.Migrate();
    }

    host.Run();
}

は、 Migrate() IMigrator より高度なシナリオで使用できるサービスの上に構築されていることに注意してください。Note that Migrate() builds on top of the IMigrator service, which can be used for more advanced scenarios. アクセスするには myDbContext.GetInfrastructure().GetService<IMigrator>() を利用します。Use myDbContext.GetInfrastructure().GetService<IMigrator>() to access it.

警告

  • 実稼働環境でこの方法を使用する前に、慎重に検討してください。Carefully consider before using this approach in production. この展開戦略の単純化は、作成される問題によって上回るされていることがわかりました。Experience has shown that the simplicity of this deployment strategy is outweighed by the issues it creates. 代わりに、移行から SQL スクリプトを生成することを検討してください。Consider generating SQL scripts from migrations instead.
  • Migrate() の前に EnsureCreated() を呼び出さないでください。Don't call EnsureCreated() before Migrate(). EnsureCreated() は移行をバイパスしてスキーマを作成し、Migrate() が失敗します。EnsureCreated() bypasses Migrations to create the schema, which causes Migrate() to fail.