Migrationとスキーマ管理
Migrationを作成、適用、ロールバックして、データベーススキーマを安全に進化させます。
「Migrationとスキーマ管理」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
EF Core のマイグレーションとは
マイグレーションは、データベーススキーマの段階的な変更を記述するコード生成ファイルです。DDL SQL を手作業で記述する代わりに、EF Core が自動的に生成して適用するため、コードとデータベースを同期した状態に保てます。
EF Core Tools のインストール
ターミナルからマイグレーションコマンドを実行するには、EF Core CLI ツール(dotnet-ef)をグローバルツール(またはローカルツール)としてインストールする必要があります。
# Install globally
dotnet tool install --global dotnet-ef
# Verify
dotnet ef --version
# Required NuGet packages in your project:
# Microsoft.EntityFrameworkCore.Design
# Microsoft.EntityFrameworkCore.SqlServer (or Sqlite, etc.)最初のマイグレーションの作成
dotnet ef migrations add は、現在のモデルと最後のスナップショットを比較し、Up()(適用)メソッドと Down()(ロールバック)メソッドを含むマイグレーションファイルを生成します。
# Create initial migration
dotnet ef migrations add InitialCreate
# Output files created:
# Migrations/20240101_InitialCreate.cs <- Up/Down
# Migrations/20240101_InitialCreate.Designer.cs
# Migrations/AppDbContextModelSnapshot.cs <- current modelマイグレーションファイルの内部
各マイグレーションには、変更を適用する Up メソッドと、変更を元に戻す Down メソッドがあります。EF Core はモデルの差分からこれらを自動的に生成します。
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Products",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Name = table.Column<string>(maxLength: 200, nullable: false),
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
},
constraints: table => table.PrimaryKey("PK_Products", x => x.Id));
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(name: "Products");
}
}マイグレーションの適用
dotnet ef database update は、適用されていないすべてのマイグレーションを適用します。EF Core は、どのマイグレーションが実行済みかを __EFMigrationsHistory テーブルで管理します。
# Apply all pending migrations
dotnet ef database update
# Apply up to a specific migration
dotnet ef database update AddProductIndex
# Roll back to a previous migration
dotnet ef database update InitialCreate起動時のプログラムによるマイグレーション
本番環境では、起動時にプログラムからマイグレーションを適用できます。これにより、手動で CLI を実行しなくてもデータベースを常に最新の状態に保てます。
var app = builder.Build();
// Apply pending migrations at startup
using (var scope = app.Services.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
await db.Database.MigrateAsync();
}
app.Run();新しいマイグレーションでの列の追加
エンティティにプロパティを追加してから、新しいマイグレーションを作成します。EF Core が変更を検出し、AddColumn 操作を生成します。
// 1. Add property to entity
public class Product
{
public int Id { get; set; }
public string Name { get; set; } = "";
public decimal Price { get; set; }
public string? Description { get; set; } // NEW
}
// 2. Generate migration
// dotnet ef migrations add AddProductDescription
// Generated Up():
migrationBuilder.AddColumn<string>(
name: "Description",
table: "Products",
nullable: true);マイグレーションでのデータシード
OnModelCreating で HasData を使用し、参照データをシードします。EF Core は、マイグレーションの Up に INSERT 文として組み込みます。
modelBuilder.Entity<Category>().HasData(
new Category { Id = 1, Name = "Electronics" },
new Category { Id = 2, Name = "Books" },
new Category { Id = 3, Name = "Clothing" }
);
// Then regenerate the migration:
// dotnet ef migrations add SeedCategoriesマイグレーションでのカスタム SQL
EF Core が自動生成できない DDL(トリガー、ビュー、ストアドプロシージャなど)が必要な場合は、migrationBuilder.Sql() を使用します。
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql(@"
CREATE VIEW vw_ActiveProducts AS
SELECT Id, Name, Price
FROM Products
WHERE IsActive = 1
");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql("DROP VIEW vw_ActiveProducts");
}マイグレーションの削除
まだ適用していないマイグレーションは、dotnet ef migrations remove で削除できます。この方法で削除できるのは最後のマイグレーションだけです。
# Remove the last unapplied migration
dotnet ef migrations remove
# List all migrations and their status
dotnet ef migrations list
# Script all migrations to SQL (for DBA review)
dotnet ef migrations script --output deploy.sql実践例: CI/CD のマイグレーション戦略
CI/CD パイプラインでは、マイグレーションスクリプトを生成し、適用前に DBA にレビューしてもらいます。重要な本番システムで MigrateAsync() を無条件に実行してはいけません。
# Generate idempotent script for all pending migrations
dotnet ef migrations script --idempotent --output migrations.sql
# Review migrations.sql, then apply via sqlcmd / psql:
# sqlcmd -S server -d db -i migrations.sql理解度チェック
データベースに適用済みのマイグレーションを追跡する EF Core のテーブルはどれですか?
まとめ: マイグレーションとスキーマ管理
重要なポイント:
dotnet ef migrations add <Name>は、スキーマの段階的な変更ファイルを生成します- 各マイグレーションには、
Up()(適用)メソッドとDown()(ロールバック)メソッドがあります dotnet ef database updateは、適用されていないマイグレーションを適用します- 自動デプロイでは、アプリケーションの起動時に
MigrateAsync()を使用します - 本番パイプラインでは、DBA がレビューできるように冪等 SQL スクリプトを生成します
AI チューターと学ぶ C# — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 93
- レッスン
- 346
よくある質問
「Migrationとスキーマ管理」レッスンは無料ですか?
はい。「Migrationとスキーマ管理」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「Migrationとスキーマ管理」で何を学びますか?
Migrationを作成、適用、ロールバックして、データベーススキーマを安全に進化させます。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Migrationとスキーマ管理」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- DbContextとDbSetの基礎
- Migrationとスキーマ管理
- EF CoreによるCRUD操作
- リレーションシップ:一対多と多対多