Entity Framework Coreデータの移行
移行は、データを保持することにより、データベースアーキテクチャをEF Coreモデルと同期させる方法です。
上の図に示すように、EF Core APIはドメイン(エンティティ)クラスからEF Coreモデルを構築し、EF Coreの移行はEF Coreモデルに基づいてデータベーススキーマを作成または更新します。ドメインクラスを変更するたびに、データベーススキーマを最新に保つために移行を実行する必要があります。
EF Coreの移行は、NuGetパッケージマネージャーコンソールまたはdotnetコマンドラインインターフェイス(CLI)で実行できる一連のコマンドです。
次の表に、EF Coreの重要な移行コマンドを示します。
パッケージマネージャーのコンソールコマンド | dotnetコマンドラインコマンド | 使い方 |
---|---|---|
add-migration <移行名> | <移行名>を追加 | 移行スナップショットを追加して移行を作成する |
移行の削除 | 削除する | 最後の移行スナップショットを削除する |
データベースを更新する | 更新 | 最後の移行スナップショットに基づいてデータベーススキーマを更新する |
スクリプトの移行 | 脚本 | すべての移行スナップショットを使用してSQLスクリプトを生成する |
移行を追加
初めて、初期ドメインクラスを定義しました。この時点で、アプリケーションには、ドメインクラスにデータを格納するためのデータベースがありません。したがって、最初にマイグレーションを作成する必要があります。
Visual Studioで、ツール-> NuGetパッケージマネージャー->パッケージマネージャーコンソールからパッケージマネージャーコンソールを開き、次のコマンドを実行して移行を追加します。
add-migration MyFirstMigration
dotnetコマンドラインインターフェースを使用している場合は、以下のコマンドを実行してください。
dotnet ef migrations add MyFirstMigration
上記のコマンドで、MyFirstMigrationは移行の名前です。これにより、以下に示すように、プロジェクトの「Migration」フォルダーに3つのファイルが作成されます。
- <timestamp> _ <移行名> .cs:メインの移行ファイル。Up()およびDown()メソッドでの移行操作が含まれます。Up()メソッドにはデータベースオブジェクトを作成するためのコードが含まれ、Down()メソッドにはデータベースオブジェクトを削除するためのコードが含まれます。
- <Timestamp> _ <移行名> .Designer.cs:EF Coreが使用する情報を含む移行メタデータファイル。
- <contextclassname> ModelSnapshot.cs:現在のモデルのスナップショット。これは、次のマイグレーションの作成時に行われた変更を判別するために使用されます。
ここで、移行スナップショットを作成した後、データベースを作成します。
データベースを作成または更新する
次のコマンドを使用して、データベーススキーマを作成または更新します。
- パッケージマネージャーコンソール
Update-Database
- dotnetコマンドライン
dotnet ef database update
Updateコマンドは、コンテキストとドメインクラスおよび移行スナップショットに基づいてデータベースを作成します。これらのスナップショットは、add-migrationまたはaddコマンドを使用して作成されます。
これが最初の移行である場合、__ EFMigrationsHistoryという名前のテーブルも作成されます。このテーブルには、すべての移行の名前と、それらがデータベースにいつ適用されるかが格納されます。
移行を削除
最後の移行がデータベースに適用されなかった場合は、それを削除できます。次の削除コマンドを使用して、最後に作成された移行ファイルを削除し、モデルのスナップショットを復元します。
- パッケージマネージャーコンソール
remove-migration
- dotnetコマンドライン
dotnet ef migrations remove
上記のコマンドは、最後の移行を削除し、モデルのスナップショットを以前の移行に復元します。移行がデータベースに適用されている場合、次の例外がスローされることに注意してください。
移行<移行名>がデータベースに適用されました。復元してもう一度お試しください。移行が他のデータベースに適用されている場合は、新しい移行を使用して変更を元に戻すことを検討してください。
移行を復元
ドメインクラスを変更し、add-migrationコマンドを使用してMySecondMigrationという名前の2番目の移行を作成し、Updateコマンドを使用して移行をデータベースに適用するとします。ただし、何らかの理由で、データベースを以前の状態に復元する必要があります。この場合、update-database <migration name>コマンドを使用して、指定した以前の移行スナップショットにデータベースを復元します。
- パッケージマネージャーコンソール
Update-database MyFirstMigration
- dotnetコマンドライン
dotnet ef database update MyFirstMigration
上記のコマンドは、MyFirstMigrationという名前の移行に基づいてデータベースを復元し、MySecondMigrationという名前の2番目の移行に適用されたすべての変更を削除します。これにより、データベースの__EFMigrationsHistoryテーブルからMySecondMigrationエントリも削除されます。
注:これにより、MySecondMigrationに関連する移行ファイルは削除されません。プロジェクトから削除するには、removeコマンドを使用します。
SQLスクリプトを生成する
次のコマンドを使用して、データベースのSQLスクリプトを生成します。
- パッケージマネージャーコンソール
script-migration
- dotnetコマンドライン
dotnet ef migrations script
上記のスクリプトコマンドには、デフォルトで移行されたすべてのスクリプトが含まれます。-toおよび-fromオプションを使用して、移行スコープを指定できます。
パッケージマネージャコンソールコマンドから
Visual Studioのパッケージマネージャーコンソールを使用して、Entity Framework Coreで移行コマンドを実行できます。Visual Studioの[ツール]-> [NuGetパッケージマネージャー]-> [パッケージマネージャーコンソール]からパッケージマネージャーコンソールを開き、次のコマンドを実行します。
パッケージマネージャーコンソール | 使い方 |
---|---|
Get-Helpエンティティフレームワーク | Entity Frameworkコマンドに関する情報を表示するためのヘルプentityframeworkを取得する |
追加移行 | <移行名>移行スナップショットを追加して移行を作成します |
移行の削除 | 最後の移行スナップショットを削除する |
データベースを更新する | 最後の移行スナップショットに基づいてデータベーススキーマを更新する |
スクリプトの移行 | すべての移行スナップショットを使用してSQLスクリプトを生成する |
Scaffold-DbContext | 指定されたデータベースのDbContextおよびエンティティタイプクラスを生成します。これはリバースエンジニアリングと呼ばれています |
Get-DbContext | DbContextタイプに関する情報を取得する |
ドロップデータベース | データベースを削除する |
Get-Help
get-help entityframework
Add-Migration Add migration
get-help entityframework
移行の削除
get-help entityframework
データベースの更新
get-help entityframework
スクリプトの移行スクリプトの移行
get-help entityframework
scaffold-dbcontext scaffoldデータベースコンテキスト
get-help entityframework
Get-DbContext
get-help entityframework
ドロップデータベース
get-help entityframework
移行用のコマンドラインインターフェイスコマンド
.NET Core Command List Interfaceを使用して、Entity Frameworkコアコマンドを実行します。.NET CLIを使用するには、.NET Coreプロジェクトの.csprojファイルを編集して、<ItemGroup>ノードの下に<DotNetCliToolReference Include = "Microsoft.EntityFrameworkCore.Tools.DotNet" Version = "2.0.0" />を追加します。
コマンドプロンプトを開き、プロジェクトのルートフォルダーに移動し、dotnet ef --helpと入力して、以下に示すようにEF Coreコマンドを一覧表示します。
[外部チェーンイメージの転送に失敗しました。ソースサイトに盗難防止チェーンメカニズムがある可能性があります。イメージを保存して直接アップロードすることをお勧めします(img-cD0PztSl-1581165405066)(d:\ note \ efcore \ pic \ 31.png)]
上記のように、データベース、dbcontext、および移行の3つの主要なEFコマンドを使用できます。次の表に、すべてのEFコマンドとサブコマンドを示します。
コマンド | サブコマンド | 使い方 |
---|---|---|
データベース | 落とす | データベースを削除する |
更新 | データベースを指定された移行に更新します | |
DbContext | 情報 | DbContextタイプに関する情報を取得する |
リスト | 利用可能なDbContextタイプをリストする | |
足場 | データベースのDbContextとエンティティタイプを提供する | |
マイグレーション | 追加 | 新しい移行を追加 |
リスト | 利用可能な移行を一覧表示する | |
削除する | 最後の移行を削除 | |
脚本: | 移行からSQLスクリプトを生成する |
各コマンドで使用できるオプションを見てみましょう。
データベースのドロップ
dotnet ef database drop
データベースの更新
dotnet ef database update
DbContext情報
dotnet ef dbcontext info
DbContextリスト
dotnet ef dbcontext list
DbContext足場
dotnet ef dbcontext scaffold
追加
dotnet ef migrations add
リスト
dotnet ef migrations list
削除する
dotnet ef migrations remove
脚本
dotnet ef migrations script