0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【保険商品管理システムの開発】Program.csのシードデータが画面に表示されるまでのステップ

Posted at

シードデータがどのように Program.cs → AppDbContext.cs → Product.cs → InsuranceProductsController.cs の順で流れていき、最終的に画面(ブラウザやAPIレスポンス)に表示されるのかを、ステップごとに解説します。

1. Program.cs — アプリの起動と初期データ投入

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の橋渡し

Data/AppDbContext.cs
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 — データの形(モデル)

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 の入り口

Controllers/InsuranceProductsController.cs
[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. ブラウザ表示までの流れ(まとめ)

  1. アプリ起動
    Program.cs が実行され、AppDbContext を通じて InMemory DB(メモリ上だけに存在するデータベース) に初期データを保存。

  2. クライアントが API を叩く
    ブラウザや API ツール(curl/Postmanなど)が
    GET https://localhost:7252/api/InsuranceProducts を実行。

  3. コントローラーがリクエストを処理
    InsuranceProductsController の GetProducts() が呼ばれ、AppDbContext から Products のデータを取得。

  4. JSON レスポンス生成
    取得した Product モデルのリストを JSON 形式にシリアライズして返す。
    ASP.NET Core の JSON シリアライザー(既定では System.Text.Json)
    • コントローラーの戻り値を自動的に JSON に変換
    • モデルのプロパティ名がそのまま JSON のキーになる

  5. ブラウザに表示
    ブラウザや API ビューアで {"totalItems":2, "items":[...]} のような結果が見える。
0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?