練習 - 將 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。
在終端機中,執行
dotnet new來建立 Web API:dotnet new web -o PizzaStore -f net8.0您應該會看到 PizzaStore 目錄。
輸入下列命令以移至 PizzaStore 目錄:
cd PizzaStore安裝 Swashbuckle 套件:
dotnet add package Swashbuckle.AspNetCore --version 6.5.0在 Visual Studio Code 中開啟專案。
使用 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 將此數據模型對應至資料庫數據表。開啟 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 套件。
按 Ctrl+' 以在 Visual Studio Code 中開啟終端機。 在新終端機中,輸入下列程式代碼以新增 EF Core InMemory 套件:
dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 8.0將 新增
using Microsoft.EntityFrameworkCore;至 Program.cs 和 Pizza.cs 檔案頂端。現在您已將 EF Core 新增至專案,您可以將程式代碼連線到您想要儲存和查詢的數據。 若要執行此步驟,請建立類別
PizzaDb。 類別PizzaDb會執行下列工作:- 從資料庫中的
Pizzas清單公開Pizza屬性。 - 使用
UseInMemoryDatabase來連接記憶體內部資料庫儲存體。 只要應用程式正在執行,您的資料會儲存在這裡。
- 從資料庫中的
若要設定記憶體內部資料庫,請將下列程式代碼新增至 Pizza.cs 檔案底部(最後
}一個上方)。 命名空間內會有兩個PizzaStore.Models類別定義。class PizzaDb : DbContext { public PizzaDb(DbContextOptions options) : base(options) { } public DbSet<Pizza> Pizzas { get; set; } = null!; }DbContext表示用來查詢和儲存資料庫中實體實例的連接或會話。將 新增
using PizzaStore.Models;至 Program.cs 檔案頂端。在 Program.cs 中,於 呼叫
AddSwaggerGen之前,新增下列程式代碼:builder.Services.AddDbContext<PizzaDb>(options => options.UseInMemoryDatabase("items"));
傳回項目清單
若要從披薩清單中的項目清單讀取,請在 呼叫
app.Run();上方新增下列程式代碼以新增 「/pizzas」 路由:app.MapGet("/pizzas", async (PizzaDb db) => await db.Pizzas.ToListAsync());
執行應用程式
確定您已儲存所有的變更。 在終端機中呼叫
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在瀏覽器中,前往 https://localhost:{PORT}/swagger。 選取
GET /pizzas按鈕,然後試用和執行。 您會看到在Response body下,清單是空的。在終端機中,按 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。 若要將新項目新增至披薩清單:
選取 POST /pizza。
選取 [試用]。
以下列 JSON 取代請求主體:
{ "name": "Pepperoni", "description": "A classic pepperoni pizza" }選取 [執行]。
若要讀取清單中的項目:
選取 [GET /pizzas]。
選取 [試用]。
選取 [執行]。
Response body將包含剛新增的項目。[ { "id": 1, "name": "Pepperoni", "description": "A classic pepperoni pizza" } ]在終端機中按 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
在 Swagger UI 中選取 PUT /pizza/{id} 。
選取 [試用]。
在 [ 標識符 ] 文本框中,輸入 1。
最後,更新
Request body。 貼上下列 JSON 並變更name為Pineapple。{ "id": 1, "name": "Pineapple" }選取 [執行]。
若要測試程式代碼,請往回捲動至 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 應用程式,並使用記憶體內部資料庫來儲存數據。 接下來,您將瞭解如何使用實際資料庫來儲存數據,以便在應用程式關機之間保存。