แบบฝึกหัด - เพิ่ม EF Core ไปยัง API น้อยที่สุด
คุณเป็นนักพัฒนาสําหรับบริษัท และคุณและบริษัทของคุณเคยได้ยินเกี่ยวกับ API แบบมินิมอลใหม่ ผู้จัดการของคุณขอให้คุณสร้างโครงการเพื่อให้คุณสามารถพูดคุยว่าจะใช้งานกับโครงการถัดไปของคุณหรือไม่
โน้ต
โมดูลนี้ใช้ .NET CLI (อินเทอร์เฟซบรรทัดคําสั่ง) และรหัส Visual Studio สําหรับการพัฒนาภายในเครื่อง หลังจากจบโมดูลนี้คุณสามารถใช้แนวคิดได้โดยใช้ Visual Studio (Windows), Visual Studio สําหรับ 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 การจัดการพิซซ่า
ในเทอร์มินัล สร้าง API เว็บโดยการเรียกใช้
dotnet new: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.Modelsnamespaceclass 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();เพื่อเพิ่มเส้นทาง "/พิซซ่า"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 วิธีเพิ่มรายการใหม่ลงในรายการพิซซ่า:
เลือก โพสต์/พิซซ่า
เลือก ลองใช้
แทนที่เนื้อความคําขอด้วย JSON ต่อไปนี้:
{ "name": "Pepperoni", "description": "A classic pepperoni pizza" }เลือก ดําเนินการ
เมื่อต้องการอ่านหน่วยข้อมูลในรายการ:
เลือก รับ/พิซซ่า
เลือก ลองใช้
เลือก ดําเนินการ
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 โดย ID
เมื่อต้องการทดสอบการดําเนินการนี้ คุณสามารถไปที่ https://localhost:{PORT}/pizza/1 หรือใช้ Swagger UI เนื่องจากคุณกําลังใช้ฐานข้อมูลในหน่วยความจํา ระบบจะไม่แสดงพิซซ่าที่คุณเคยสร้างไว้ก่อนหน้านี้หากคุณรีสตาร์ตแอปพลิเคชัน ดังนั้น คุณจะต้องใช้การดําเนินการโพสต์ของคุณเพื่อเพิ่มอีกครั้ง
อัปเดตรายการ
เมื่อต้องการอัพเดตสินค้าที่มีอยู่ ให้เพิ่มรหัสภายใต้กระบวนการผลิต 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
เลือก PUT /พิซซ่า/{id} ใน Swagger UI
เลือก ลองใช้
ในกล่องข้อความ 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 ที่น้อยที่สุดที่มีอยู่ และใช้ฐานข้อมูลในหน่วยความจําเพื่อจัดเก็บข้อมูล ถัดไป คุณจะได้เรียนรู้วิธีการใช้ฐานข้อมูลจริงเพื่อจัดเก็บข้อมูลเพื่อให้ยังคงอยู่ระหว่างการปิดแอปพลิเคชัน