シードデータがどのように Program.cs → AppDbContext.cs → Product.cs → InsuranceProductsController.cs の順で流れていき、最終的に画面(ブラウザやAPIレスポンス)に表示されるのかを、ステップごとに解説します。
1. Program.cs — アプリの起動と初期データ投入
using (var scope = app.Services.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
db.Products.AddRange(
new Product { Name = "保険A", Description = "説明A", Price = 1000 },
new Product { Name = "保険B", Description = "説明B", Price = 2000 }
);
db.SaveChanges();
}
• アプリ起動時 (app.Run() の前) に、この処理が実行されます。
• app.Services.CreateScope() で 依存性注入コンテナ(DIコンテナ)から AppDbContext のインスタンスを取得します。
• db.Products.AddRange(...) で Product モデルのデータをメモリ上の DB に追加します。
• db.SaveChanges() で DB(今回はInMemory)に確定保存します。
ここでのポイント
• この時点でまだ HTTP リクエストは発生していません。あくまで「アプリが起動した瞬間にデータを準備する」処理です。
• モデルクラス Product の形に合わせてデータが保存されます。
2. Data/AppDbContext.cs — モデルとDBの橋渡し
public class AppDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
}
• Entity Framework Core の DbContext を継承したクラス。
• DbSet が「Products」というテーブルのような役割を持ちます。
• InMemory データベースの場合も、DbSet はテーブル的に機能します。
• Program.cs の db.Products.AddRange(...) やコントローラーからの db.Products.ToList() はすべてここを通ります。
3. Models/Product.cs — データの形(モデル)
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public bool IsPrivate { get; set; }
}
• データの「型」を定義します。
• AppDbContext と一緒に使うことで、この構造が DB のテーブル設計になります。
• Program.cs のシードデータも、このクラスの形で作られています。
• クライアント(ブラウザやAPI呼び出し側)に返す JSON のキー名も基本的にこのプロパティ名になります。
4. Controllers/InsuranceProductsController.cs — API の入り口
[HttpGet]
public async Task<IActionResult> GetProducts(int page = 1, int pageSize = 10)
{
var totalItems = await _context.Products.CountAsync();
var products = await _context.Products
.OrderBy(p => p.Id)
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToListAsync();
return Ok(new { totalItems, items = products });
}
• ブラウザが https://localhost:7252/api/InsuranceProducts にアクセスすると、このメソッドが呼ばれます。
• _context.Products → AppDbContext.Products → InMemory DB にアクセス。
• 起動時に Program.cs で登録した「保険A」「保険B」のデータが読み込まれます。
• 読み込んだデータを JSON に変換して HTTP レスポンスとして返します。
5. ブラウザ表示までの流れ(まとめ)
- アプリ起動
Program.cs が実行され、AppDbContext を通じて InMemory DB(メモリ上だけに存在するデータベース) に初期データを保存。
- クライアントが API を叩く
ブラウザや API ツール(curl/Postmanなど)が
GET https://localhost:7252/api/InsuranceProducts を実行。
- コントローラーがリクエストを処理
InsuranceProductsController の GetProducts() が呼ばれ、AppDbContext から Products のデータを取得。
- JSON レスポンス生成
取得した Product モデルのリストを JSON 形式にシリアライズして返す。
ASP.NET Core の JSON シリアライザー(既定では System.Text.Json)
• コントローラーの戻り値を自動的に JSON に変換
• モデルのプロパティ名がそのまま JSON のキーになる
- ブラウザに表示
ブラウザや API ビューアで {"totalItems":2, "items":[...]} のような結果が見える。