C# でアプリを作っていると、ほぼ確実に登場するのが データベースとのやり取り。
SQL を直接書くのももちろんアリですが、
「もっと C# のコードだけで自然に扱いたい」
そんなときに頼れるのが Entity Framework(EF Core) です。
この記事では、EF Core を使って
「C# のクラスをそのまま DB のテーブルとして扱う」
という感覚をつかんでもらえるよう、実装例を中心に紹介します。
1. Entity Framework とは何者か
ざっくり言うと、EF は ORM(Object Relational Mapper) の一種です。
難しく聞こえますが、やっていることはシンプルで、
- C# のクラス ⇔ データベースのテーブル
- C# のプロパティ ⇔ テーブルのカラム
という対応関係を自動で作ってくれる仕組みです。
SQL を書かずに、C# のコードでデータを CRUD(Create / Read / Update / Delete)できます。
2. 事前準備:NuGet パッケージを追加する
Entity Framework Core を使うために、まずは以下の NuGet パッケージをプロジェクトに追加します。
-
Microsoft.EntityFrameworkCore
→ EF Core の本体 -
Microsoft.EntityFrameworkCore.Sqlite
→ SQLite を使う場合のプロバイダー
(SQL Server を使うならMicrosoft.EntityFrameworkCore.SqlServer) -
Microsoft.EntityFrameworkCore.Tools
→ マイグレーションなど、開発時に便利なツール群
Visual Studio の「NuGet パッケージ マネージャー」から検索して追加すれば準備完了です。
3. モデル(エンティティ)を作る
まずは C# のクラスを 1 つ作ります。
これがそのまま DB のテーブルになります。
public class TodoItem
{
public int Id { get; set; }
public string Title { get; set; } = string.Empty;
public bool IsDone { get; set; }
}
💡補足:PK(主キー)について
Id プロパティは、Entity Framework によって 自動的に主キー(Primary Key / PK)として扱われます。
EF Core では Id や TodoItemId のような名前のプロパティは特別な設定なしで主キーとして認識されます。
4. DbContext を作る
EF Core の中心となるクラスが DbContext です。
「アプリとデータベースの橋渡し役」と考えるとイメージしやすいです。
public class AppDbContext : DbContext
{
public DbSet<TodoItem> TodoItems => Set<TodoItem>();
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite("Data Source=todo.db");
}
DbSet<T> がテーブルに相当し、
TodoItems を通じてデータを操作できます。
5. 実際に CRUD をやってみる
5-1. Create(追加)
using var db = new AppDbContext();
var item = new TodoItem
{
Title = "Entity Framework の記事を書く",
IsDone = false
};
db.TodoItems.Add(item);
db.SaveChanges();
5-2. Read(取得)
var items = db.TodoItems.ToList();
foreach (var i in items)
{
Console.WriteLine($"{i.Id}: {i.Title} - {(i.IsDone ? "Done" : "Pending")}");
}
LINQ がそのまま使えるので、
「C# のコレクションを扱う感覚」で DB を検索できます。
5-3. Update(更新)
var item = db.TodoItems.First(i => i.Id == 1);
item.IsDone = true;
db.SaveChanges();
5-4. Delete(削除)
var item = db.TodoItems.First(i => i.Id == 1);
db.TodoItems.Remove(item);
db.SaveChanges();
6. マイグレーションで DB を自動生成する
EF Core の便利なところは、
コードから DB を自動生成できる ことです。
dotnet ef migrations add InitialCreate
dotnet ef database update
これで todo.db が生成され、
TodoItems テーブルが作られます。
💡補足:マイグレーションとは?
マイグレーション(Migration)は、
「C# のモデル(クラス)とデータベースの構造を同期させるための仕組み」 です。
- モデルにプロパティを追加した
- テーブル構造を変更したい
- 新しいエンティティを追加した
こういった変更を、SQL を手書きすることなく
「差分として記録し、DB に反映する」 のがマイグレーションです。
開発が進むほどテーブル構造は変わるものなので、
マイグレーションを使うことで
「いつ・どんな変更をしたか」 を履歴として残せるのも大きなメリットです。
7. 実際のアプリでの構成イメージ
テキスト図で構成をイメージするとこんな感じです。
[Controller / Service]
│
▼
(AppDbContext)
│
▼
[Database]
アプリ側は DbContext に話しかけるだけで、
裏側の SQL は EF が全部やってくれます。
8. EF Core を使うと何が嬉しいのか
実際に使ってみて感じるメリットは次の通りです。
- SQL を書く量が圧倒的に減る
- LINQ で直感的にデータ操作できる
- モデルと DB の整合性を保ちやすい
- マイグレーションで DB の変更管理が楽になる
特に「LINQ で検索できる」のは、
一度慣れると手放せなくなります。
9. 逆に気をつけたいポイント
もちろん万能ではありません。
私が実際に使っていて気をつけている点も書いておきます。
- 複雑なクエリは SQL の方が速いことがある
- Include の使いすぎで N+1 問題が起きやすい
- マイグレーションの管理はチーム開発だと慎重に扱う必要がある
「EF で書くべきか、SQL で書くべきか」
この判断ができるようになると、さらに開発が快適になります。
10. まとめ
Entity Framework Core は、
「C# のコードで DB と自然に会話できる」
そんな開発体験を提供してくれる ORM です。
- モデルを作る
- DbContext を作る
- LINQ で CRUD
- マイグレーションで DB 管理
この流れさえ押さえておけば、小規模アプリから業務システムまで幅広く活用できます。
実際に手を動かしてみると、C# と DB の距離がぐっと近く感じられるはずです。
この記事が「EF Core をちょっと触ってみようかな」と思うきっかけになれば嬉しいです。