練習 - 從現有的資料庫進行反向工程

已完成

Contoso Pizza 的經理要求您新增端點,讓公司可以在其應用程式中顯示優待券。 優待券位於現有的資料庫中。 在此課程單元中,您會從現有的資料庫建立 Scaffolding,並修改產生的實體類別。

檢查促銷資料庫

查看您將用來產生 Scaffold 程式碼的資料庫:

  1. 在 [總管] 窗格中,展開 [促銷] 目錄,以滑鼠右鍵按一下 [Promotions.db] 檔案,然後選取 [開啟資料庫]

    新的資料庫會在 [SQLite Explorer] 資料夾中開啟。

  2. 在 [SQLite Explorer] 窗格中,展開 [Promotions.db] 和 [優待券] 節點。 記下資料結構描述。

  3. 以滑鼠右鍵按一下 [優待券] 節點,然後選取 [顯示資料表]。 檢查優待券資料。

建構促銷內容和優待券模型

現在,您會使用資料庫來建構程式碼:

  1. 執行下列命令:

    dotnet ef dbcontext scaffold "Data Source=Promotions/Promotions.db" Microsoft.EntityFrameworkCore.Sqlite --context-dir Data --output-dir Models   
    

    上述命令:

    • 使用提供的連接字串來建構 DbContext 和模型類別。
    • 指定使用 Microsoft.EntityFrameworkCore.Sqlite 資料庫提供者。
    • 指定結果 DbContext 和模型類別的目錄。

    注意

    在此練習中,您可以忽略連接字串在原始程式碼中的警告。 在真實世界程式碼中,始終將您的連接字串儲存在安全的位置。

  2. 開啟 Models\Coupon.csExpiration 屬性定義為字串,因為 SQLite 沒有日期時間資料類型。 將 Expiration 型別從 string? 變更為 DateTime。 EF Core 會管理日期時間資料轉換為字串資料的轉換。

    using System;
    using System.Collections.Generic;
    
    namespace ContosoPizza.Models
    {
        public partial class Coupon
        {
            public long Id { get; set; }
            public string Description { get; set; } = null!;
            public DateTime Expiration { get; set; }
        }
    }
    

    提示

    如果資料庫變更,您可以產生新的 Scaffold 檔案。 系統每次都會覆寫產生的檔案,但會建立為 partial 類別,因此您可以使用自己個別檔案中的自訂屬性和行為來加以擴充。

新增優待券端點

您必須先將端點新增至 API,才能測試 Scaffolded 程式碼。 接下來,您會新增 API 控制器。

若要進一步了解 API 控制器的運作方式,請參閱使用 ASP.NET Core控制器建立 Web API

  1. 在 [控制器] 資料夾中,新增名為 [CouponController.cs] 的檔案,其中包含下列程式碼:

    using ContosoPizza.Data;
    using ContosoPizza.Models;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.EntityFrameworkCore;
    
    namespace ContosoPizza.Controllers;
    
    [ApiController]
    [Route("[controller]")]
    public class CouponController : ControllerBase
    {
        PromotionsContext _context;
    
        public CouponController(PromotionsContext context)
        {
            _context = context;
        }
    
        [HttpGet]
        public IEnumerable<Coupon> Get()
        {
            return _context.Coupons
                .AsNoTracking()
                .ToList();
        }
    }
    

    此程式碼會將 api/coupon 端點新增至 API。

    在上述程式碼中:

    • PromotionsContext 物件會插入建構函式。
    • 方法 Get 會傳回所有優待券。
  2. Program.cs 中,使用下列程式碼取代 // Add the PromotionsContext 註解:

    builder.Services.AddSqlite<PromotionsContext>("Data Source=Promotions/Promotions.db");
    

    此程式碼會使用相依性插入系統註冊 PromotionsContext

  3. 儲存所有變更,並使用 dotnet run 以執行應用程式。

測試端點

現在已新增端點,請測試優待券作業:

  1. 請移至 API 的 Swagger UI,就像您在先前的練習中所做的一樣 (或重新整理瀏覽器中的現有 UI)。

  2. 在 [優待券] 標題下,展開 [GET] 作業,然後選取 [試用]

  3. 選取 [執行]。 回應本文會顯示來自資料庫的優待券:

    [
    {
        "id": 1,
        "description": "Buy 1 get 1 free",
        "expiration": "2025-01-01T00:00:00"
    },
    {
        "id": 2,
        "description": "4 large pizzas for $40",
        "expiration": "2024-06-30T00:00:00"
    }
    ]
    

    請注意,expiration 是日期時間值。

就這麼簡單! 您已經從現有資料庫建立 scaffolding 並加以修改!