練習 - 將 EF Core 新增至最低 API

已完成

您是某家公司的開發人員,而且您和您的公司聽說了新推出的最低 API。 您的經理要求您為其建立專案,以便討論是否要在下一個專案上使用該專案。

備註

本課程模組使用 .NET CLI (命令列介面) 和 Visual Studio Code 進行本機開發。 完成本課程模組之後,您可以使用 Visual Studio (Windows)、Visual Studio for Mac (macOS) 來應用這些概念,或繼續使用 Visual Studio Code (Windows、Linux 和 macOS) 來進行開發。

本課程模組使用 .NET 8.0 SDK。 確認您已在慣用的命令終端中執行下列命令來安裝 .NET 8.0:

dotnet --list-sdks

類似下列範例的輸出隨即出現:

6.0.317 [C:\Program Files\dotnet\sdk]
7.0.401 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]

確定已列出開頭為 8 的版本。 如果未列出或找不到命令, 請安裝最新的 .NET 8.0 SDK

設定專案

首先,您需要建立專案。 您已安裝 .NET 6,現在已經準備好開始使用。 在此單元中,您會將資料持久性新增至披薩管理 API。

  1. 在終端機中,執行 dotnet new來建立 Web API:

    dotnet new web -o PizzaStore -f net8.0
    

    您應該會看到 PizzaStore 目錄。

  2. 輸入下列命令以移至 PizzaStore 目錄:

    cd PizzaStore
    
  3. 安裝 Swashbuckle 套件:

    dotnet add package Swashbuckle.AspNetCore --version 6.5.0
    
  4. 在 Visual Studio Code 中開啟專案。

  5. 使用 Visual Studio Code,在專案根目錄中建立 Pizza.cs 檔案,並提供下列內容:

    namespace PizzaStore.Models 
    {
        public class Pizza
        {
              public int Id { get; set; }
              public string? Name { get; set; }
              public string? Description { get; set; }
        }
    }
    

    上述 Pizza 類別是代表披薩的簡單物件。 此程式代碼是您的數據模型。 稍後,您將使用 Entity Framework (EF) Core 將此數據模型對應至資料庫數據表。

  6. 開啟 Program.cs 並新增醒目提示的程式代碼:

    using Microsoft.OpenApi.Models;
    
    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen(c =>
    {
         c.SwaggerDoc("v1", new OpenApiInfo {
             Title = "PizzaStore API",
             Description = "Making the Pizzas you love",
             Version = "v1" });
    });
    
    var app = builder.Build();
    if (app.Environment.IsDevelopment())
    {
       app.UseSwagger();
       app.UseSwaggerUI(c =>
       {
          c.SwaggerEndpoint("/swagger/v1/swagger.json", "PizzaStore API V1");
       });
    }
    
    app.MapGet("/", () => "Hello World!");
    
    app.Run();
    

    您可能會收到 Visual Studio Code 的提示,新增資產來對專案進行偵錯。 在對話框中選取 Yes

將 EF Core 新增至專案

若要將專案儲存在 to-do 清單中,請安裝 EntityFrameworkCore.InMemory 套件。

  1. Ctrl+' 以在 Visual Studio Code 中開啟終端機。 在新終端機中,輸入下列程式代碼以新增 EF Core InMemory 套件:

    dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 8.0
    
  2. 將 新增 using Microsoft.EntityFrameworkCore;Program.csPizza.cs 檔案頂端。

    現在您已將 EF Core 新增至專案,您可以將程式代碼連線到您想要儲存和查詢的數據。 若要執行此步驟,請建立類別 PizzaDb 。 類別 PizzaDb 會執行下列工作:

    • 從資料庫中的 Pizzas 清單公開 Pizza 屬性。
    • 使用 UseInMemoryDatabase 來連接記憶體內部資料庫儲存體。 只要應用程式正在執行,您的資料會儲存在這裡。
  3. 若要設定記憶體內部資料庫,請將下列程式代碼新增至 Pizza.cs 檔案底部(最後 }一個上方)。 命名空間內會有兩個 PizzaStore.Models 類別定義。

    class PizzaDb : DbContext
    {
        public PizzaDb(DbContextOptions options) : base(options) { }
        public DbSet<Pizza> Pizzas { get; set; } = null!;
    }
    

    DbContext 表示用來查詢和儲存資料庫中實體實例的連接或會話。

  4. 將 新增 using PizzaStore.Models;Program.cs 檔案頂端。

  5. Program.cs 中,於 呼叫 AddSwaggerGen之前,新增下列程式代碼:

    builder.Services.AddDbContext<PizzaDb>(options => options.UseInMemoryDatabase("items"));
    

傳回項目清單

  • 若要從披薩清單中的項目清單讀取,請在 呼叫 app.Run(); 上方新增下列程式代碼以新增 「/pizzas」 路由:

    app.MapGet("/pizzas", async (PizzaDb db) => await db.Pizzas.ToListAsync());
    

執行應用程式

  1. 確定您已儲存所有的變更。 在終端機中呼叫 dotnet run 來執行應用程式。 此動作會建置應用程式,並將其裝載於 5000-5300 的埠上。 HTTPS 會具有為其選取的連接埠 (介於 7000-7300 的範圍)。

    備註

    如果您想要覆蓋隨機選擇埠的行為,您可以在 launchSettings.json 中設定要使用的埠。

    dotnet run
    

    以下是輸出在終端中可能的外觀:

    Building...
     info: Microsoft.Hosting.Lifetime[14]
           Now listening on: https://localhost:7200
     info: Microsoft.Hosting.Lifetime[14]
           Now listening on: http://localhost:5100
     info: Microsoft.Hosting.Lifetime[0]
           Application started. Press Ctrl+C to shut down.
     info: Microsoft.Hosting.Lifetime[0]
           Hosting environment: Development
     info: Microsoft.Hosting.Lifetime[0]
           Content root path: /<path>/PizzaStore
    
  2. 在瀏覽器中,前往 https://localhost:{PORT}/swagger。 選取GET /pizzas按鈕,然後試用執行。 您會看到在 Response body 下,清單是空的。

  3. 在終端機中,按 Ctrl+C 停止執行程式。

建立新項目

讓我們新增程式碼以將新項目 POST 至披薩清單。 在 Program.cs 中,於您稍早建立的 app.MapGet 底下新增下列程序代碼。

app.MapPost("/pizza", async (PizzaDb db, Pizza pizza) =>
{
    await db.Pizzas.AddAsync(pizza);
    await db.SaveChangesAsync();
    return Results.Created($"/pizza/{pizza.Id}", pizza);
});

測試 API

請確定您已儲存所有變更,然後再次執行應用程式。 返回 Swagger UI,現在您應該會看到 POST/pizza。 若要將新項目新增至披薩清單:

  1. 選取 POST /pizza

  2. 選取 [試用]

  3. 以下列 JSON 取代請求主體:

    {
        "name": "Pepperoni",
        "description": "A classic pepperoni pizza"
    }
    
  4. 選取 [執行]。

若要讀取清單中的項目:

  1. 選取 [GET /pizzas]

  2. 選取 [試用]

  3. 選取 [執行]。

    Response body將包含剛新增的項目。

    [
      {
        "id": 1,
        "name": "Pepperoni",
        "description": "A classic pepperoni pizza"
      }
    ]
    
  4. 在終端機中按 Ctrl+C 以停止執行應用程式。 在此練習的其餘部分,請視需要停止並重新啟動應用程式,以測試您的變更。 在進行 dotnet run 之前,請務必先儲存您的所有變更!

取得單一項目

若要依 id 取得項目,請在您稍早建立的 app.MapPost 路由底下新增程式碼。

app.MapGet("/pizza/{id}", async (PizzaDb db, int id) => await db.Pizzas.FindAsync(id));

依識別碼測試 GET

若要測試這項作業,您可以移至 https://localhost:{PORT}/pizza/1 或使用 Swagger UI。 由於您使用記憶體內部資料庫,因此如果您重新啟動應用程式,您先前建立的披薩將不會列出。 因此,您需要再次使用 POST 操作來新增它。

更新項目

若要更新現有的專案,請在您建立的 GET /pizza/{id} 路由底下新增程序代碼:

app.MapPut("/pizza/{id}", async (PizzaDb db, Pizza updatepizza, int id) =>
{
      var pizza = await db.Pizzas.FindAsync(id);
      if (pizza is null) return Results.NotFound();
      pizza.Name = updatepizza.Name;
      pizza.Description = updatepizza.Description;
      await db.SaveChangesAsync();
      return Results.NoContent();
});

測試 PUT

  1. 在 Swagger UI 中選取 PUT /pizza/{id}

  2. 選取 [試用]

  3. 在 [ 標識符 ] 文本框中,輸入 1

  4. 最後,更新 Request body。 貼上下列 JSON 並變更 namePineapple

    {
       "id": 1,
       "name": "Pineapple"
    }
    
  5. 選取 [執行]。

若要測試程式代碼,請往回捲動至 GET /pizza/{id}。 披薩現在的名稱為 Pineapple

刪除項目

若要刪除現有的項目,請在您稍早建立的 PUT /pizza/{id} 代碼下輸入:

app.MapDelete("/pizza/{id}", async (PizzaDb db, int id) =>
{
   var pizza = await db.Pizzas.FindAsync(id);
   if (pizza is null)
   {
      return Results.NotFound();
   }
   db.Pizzas.Remove(pizza);
   await db.SaveChangesAsync();
   return Results.Ok();
});

測試 DELETE

現在,請嘗試使用 Swagger 介面刪除專案。

在此單元中,您已將 EF Core 新增至現有的最小 API 應用程式,並使用記憶體內部資料庫來儲存數據。 接下來,您將瞭解如何使用實際資料庫來儲存數據,以便在應用程式關機之間保存。