本文へスキップ
BecomeCoder

C#実践コース · 第5章 代表的なSDK · レッスン27

Entity Framework Core入門(ローカル実施)

ローカル実施
スターターをダウンロード(.zip)

導入

前回はADO.NETで生のDB操作を体験しました。実務では毎回それを書くのは非効率なので、DBを「クラスとLINQだけ」で扱える**Entity Framework Core(EF Core)**が使われます。SQLを書かずにdb.Books.Where(b => b.Price >= 2000)がそのままDB検索になります。

図解

flowchart LR
    CODE["LINQ<br/>db.Books.Where(...)"] --> EF["EF Core<br/>SQLに自動翻訳+結果をオブジェクトに復元"]
    EF --> DB[("SQLite / SQL Server / PostgreSQL")]

進め方

  1. スターター111-efcore/starter.zipを展開し、EfCoreLesson.slnを開く(EF Core + SQLite導入済み)
  2. Program.csのTODOを上から埋める
  3. 期待される出力と照合する
Visual StudioでEF CoreのLINQクエリを実行し、2000円以上の書籍一覧がコンソールに表示された様子
実行結果:LINQで書いた検索がSQLに翻訳され結果が返る

学ぶこと

// エンティティ = テーブルに対応するクラス
public class Book { public int Id { get; set; } public string Title { get; set; } = ""; public int Price { get; set; } }

// DbContext = DBへの窓口
public class BookContext : DbContext
{
    public DbSet<Book> Books => Set<Book>();
    protected override void OnConfiguring(DbContextOptionsBuilder o) => o.UseSqlite("Data Source=books.db");
}

// 使う側
using var db = new BookContext();
db.Database.EnsureCreated();
db.Books.Add(new Book { Title = "C#入門", Price = 2400 });
db.SaveChanges();                                    // 保存(Create)
var found = db.Books.Where(b => b.Price >= 2000).ToList();   // 検索(Read・LINQ→SQL)
  • エンティティ(クラス)=テーブル、DbSet<T>=テーブルへの窓口、SaveChangesで確定
  • 検索はLINQそのまま。EF Coreが裏でSQLに翻訳する
  • テーブル定義の変更はマイグレーションdotnet ef migrations add)でコード管理できる
  • 検索は遅延実行:ToList()の瞬間にSQLが飛ぶ(Whereを書き終えてからToListが効率的)

期待される出力

=== 2000円以上 ===
C#入門 (2400円)
実践DDD (3800円)

まとめ

  • エンティティ=テーブル、DbSet=窓口、SaveChangesで確定
  • 検索はLINQのままSQLに翻訳される
  • 変更履歴はマイグレーションでコード管理

次回: 自分がAPIを作る側になるASP.NET Core Web APIです。

テンプレート構成(教材制作用メモ)

111-efcore/
├── starter.zip   # EF Core + SQLite導入済み / Program.cs(TODO 1〜5)
└── solution/Program.cs