C# Academy · レッスン

Migrationとスキーマ管理

Migrationを作成、適用、ロールバックして、データベーススキーマを安全に進化させます。

レッスン 2/413 ステップ

「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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. DbContextとDbSetの基礎
  2. Migrationとスキーマ管理
  3. EF CoreによるCRUD操作
  4. リレーションシップ:一対多と多対多
← C# Academyに戻る