C#のEF Coreマイグレーション入門!初心者でもDB操作とスキーマ管理を徹底解説
生徒
「C#を使ってデータベースを作りたいのですが、SQLという難しい言葉を使わないとダメですか?」
先生
「いいえ、Entity Framework Core(EF Core)のマイグレーション機能を使えば、C#のコードだけでデータベースの設計図を作って管理できるんですよ。」
生徒
「マイグレーションって何ですか?難しそうに聞こえますが、初心者でもできますか?」
先生
「マイグレーションは、プログラムの変更をデータベースに反映させる便利な機能のことです。一つずつ順番に覚えていけば、パソコン初心者の方でも必ずできるようになりますよ!」
1. データベースとマイグレーションの基本を知ろう
まず、データベースとは、たくさんの情報を整理して保管しておくための巨大な引き出しのようなものです。例えば、通販サイトなら、商品名や値段、注文した人の名前などがこの引き出しの中に保存されています。通常、この引き出しを作るには「SQL」という専用の命令言語を学ぶ必要があります。しかし、プログラミングを始めたばかりの人にとって、新しい言語をいくつも覚えるのは大変ですよね。
そこで登場するのが、Entity Framework Core(エンティティフレームワークコア、略してEF Core)です。これは、C#の言葉を使ってデータベースを操作できるようにしてくれる魔法のような道具です。そして、その中でも今回学習するマイグレーションという機能は、C#で書いたプログラムの形に合わせて、データベースの形(これをスキーマと呼びます)を自動で作成・更新してくれる機能です。つまり、設計図を書き換えれば、現場の建物も自動でリフォームされるようなイメージです。
2. モデルクラスを作成してデータの形を決めよう
データベースにどんな情報を保存するかを決めるために、まずはC#でクラスというものを作ります。これは、データの型紙のようなものです。例えば、図書管理アプリを作るなら「本(Book)」という型紙が必要です。これに、タイトルや著者名といった情報を持たせます。
以下のコードは、本を管理するための最小限のクラスです。これがデータベースのテーブル(表)の元になります。Idという項目は、データを識別するための背番号のような役割を果たすので、必ず入れるようにしましょう。
public class Book
{
public int Id { get; set; } // データの背番号(主キー)
public string Title { get; set; } // 本のタイトル
public string Author { get; set; } // 著者の名前
}
このように、普通のC#のクラスを作るだけで、データベースの設計が始まります。初心者の方は、まず「どんな項目を保存したいか」を考えることからスタートしましょう。これがマイグレーションの第一歩になります。
3. DbContextを作成してデータベースへの橋渡しをしよう
次に必要なのが、DbContext(デービーコンテキスト)というクラスです。これは、先ほど作った「本」の型紙と、実際の「データベース」をつなぐ橋渡し役になります。このクラスがあるおかげで、C#は「このクラスの情報をデータベースに保存してほしいんだな」と理解してくれます。
以下のコードでは、DbContextを継承して、マイグレーションで使われる設定を記述しています。DbSetという言葉を使って、先ほどのBookクラスをデータベースの表として扱うことを宣言します。
using Microsoft.EntityFrameworkCore;
public class LibraryContext : DbContext
{
// Booksという名前のテーブルを作るための設定
public DbSet<Book> Books { get; set; }
// どのデータベースを使うか、どこに保存するかを指定する設定
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseSqlite("Data Source=library.db");
}
}
ここでは、初心者でも扱いやすいSQLiteという軽量なデータベースを使う設定にしています。特別なサーバーを用意しなくても、自分のパソコンの中にファイルとして保存されるので練習に最適です。
4. マイグレーションを実行して設計図を作成しよう
クラスの準備ができたら、いよいよマイグレーションのコマンドを使います。これは、パソコンへの命令文です。通常、Visual Studioの「パッケージマネージャーコンソール」という画面で入力します。まず最初に行うのが、現在のプログラムの状態を保存するマイグレーションの追加です。
以下のコマンドを打ち込むと、C#が自動的に「データベースをどう作るべきか」という手順書をファイルとして作成してくれます。
Add-Migration InitialCreate
InitialCreateというのは、この設計図に付ける名前です。初めて作るときは「最初の作成」という意味でこの名前がよく使われます。このコマンドを実行すると、プロジェクト内に「Migrations」というフォルダができあがり、その中に難しいコードが自動生成されます。これはあくまで手順書なので、まだこの時点ではデータベース自体は作られていません。安心してくださいね。
5. データベースを実際に作成・更新しよう
設計図(マイグレーションファイル)ができたら、次はそれを実際のデータベースに反映させます。これによって、ファイルが作成され、中にテーブル(表)が作られます。使うコマンドは以下の通りです。
Update-Database
このコマンドを実行すると、先ほどの手順書に従ってデータベースが最新の状態に更新されます。完了すると、プロジェクト内に「library.db」というファイルが現れるはずです。これがあなたの作った本物のデータベースです。
もし、後から「発売日も保存したいな」と思った場合は、C#のBookクラスに新しい項目を追加し、再びAdd-MigrationとUpdate-Databaseを順番に行うだけです。このように、段階的にデータベースを育てていけるのがマイグレーションの素晴らしいところです。
6. データを保存して動作を確認してみよう
データベースができたら、実際にプログラムからデータを保存してみましょう。SQLを一行も書かずに、C#の操作だけでデータが追加できることを確認します。以下のコードは、新しい本をデータベースに登録する簡単な例です。
using (var db = new LibraryContext())
{
// 新しい本のデータを作成
var newBook = new Book { Title = "C#入門ガイド", Author = "マイグレーション先生" };
// データベースに追加
db.Books.Add(newBook);
// 変更を保存(ここで実際にデータベースに書き込まれる)
db.SaveChanges();
Console.WriteLine("データを保存しました!");
}
db.SaveChanges()という命令を出すことで、メモリ上のデータがしっかりとファイルに書き込まれます。プログラミング未経験の方でも、この流れを繰り返すことでデータの扱い方が身についていきます。保存されたデータは、後から自由に取り出したり、書き換えたりすることが可能です。
7. マイグレーションの履歴と管理のコツ
マイグレーションを何度も繰り返すと、フォルダの中にたくさんの履歴ファイルがたまっていきます。これは「いつ、どんな変更をしたか」を記録している大事な日記のようなものです。もし間違った変更をしてしまったときは、この履歴をたどることで、過去の状態に戻すことも可能です。
また、注意点として、マイグレーションファイルは直接手で書き換えないようにしましょう。必ずC#のクラス(モデル)を変更し、コマンドを通じてファイルを生成させるのがルールです。この一貫性を守ることで、複数人で開発を行う際も「誰のパソコンでも同じデータベースの形」を保つことができます。これがスキーマ管理の真髄です。
8. 初心者がつまずきやすいポイントと解決策
マイグレーションを使っていると、エラーが出てしまうことがあります。特によくあるのが「ツールがインストールされていない」という問題です。EF Coreのコマンドを使うには、専用のツールを自分のパソコンに入れる必要があります。以下のコマンドを一度だけ実行しておくことが大切です。
dotnet tool install --global dotnet-ef
また、クラスの名前を変えたのに古いマイグレーションが残っていると、矛盾が起きて動かなくなることがあります。そんなときは、焦らずに最後に作ったマイグレーションを取り消すコマンドRemove-Migrationを試してみましょう。失敗を恐れずに、何度も試行錯誤することで、データベース操作の感覚が掴めるようになります。まずは小さなアプリから作り始めて、マイグレーションの便利さを体感してみてください。