21
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C# で始める Entity Framework 入門

21
Posted at

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 では IdTodoItemId のような名前のプロパティは特別な設定なしで主キーとして認識されます。


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 をちょっと触ってみようかな」と思うきっかけになれば嬉しいです。


21
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?