แบบฝึกหัด - เพิ่ม 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 การจัดการพิซซ่า

  1. ในเทอร์มินัล สร้าง API เว็บโดยการเรียกใช้ dotnet new:

    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.cs และ Pizza.cs ของคุณ

    ตอนนี้คุณได้เพิ่ม EF Core ไปยังโครงการแล้ว คุณสามารถเชื่อมโค้ดของคุณไปยังข้อมูลที่คุณต้องการบันทึกและคิวรีได้ เมื่อต้องการทําขั้นตอนนี้ คุณต้องสร้างคลาส PizzaDb คลาส PizzaDb จะทํางานต่อไปนี้:

    • แสดงคุณสมบัติ Pizzas ของคุณจากรายการ Pizza ในฐานข้อมูล
    • ใช้ UseInMemoryDatabase เพื่อต่อสายที่เก็บข้อมูลฐานข้อมูลในหน่วยความจํา ข้อมูลของคุณถูกจัดเก็บไว้ที่นี่ตราบใดที่แอปกําลังทํางานอยู่
  3. เมื่อต้องการตั้งค่าฐานข้อมูลในหน่วยความจําของคุณ ให้เพิ่มรหัสต่อไปนี้ที่ด้านล่างของไฟล์ Pizza.cs (เหนือ }สุดท้าย) คุณจะมีข้อกําหนดระดับชั้นสองรายการภายใน PizzaStore.Models namespace

    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(); เพื่อเพิ่มเส้นทาง "/พิซซ่า"

    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. เลือก โพสต์/พิซซ่า

  2. เลือก ลองใช้

  3. แทนที่เนื้อความคําขอด้วย JSON ต่อไปนี้:

    {
        "name": "Pepperoni",
        "description": "A classic pepperoni pizza"
    }
    
  4. เลือก ดําเนินการ

เมื่อต้องการอ่านหน่วยข้อมูลในรายการ:

  1. เลือก รับ/พิซซ่า

  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 โดย 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

  1. เลือก PUT /พิซซ่า/{id} ใน Swagger UI

  2. เลือก ลองใช้

  3. ในกล่องข้อความ id ให้ใส่ 1

  4. สุดท้าย อัปเดต Request body วาง JSON ต่อไปนี้และเปลี่ยน name เป็น Pineapple

    {
       "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 ที่น้อยที่สุดที่มีอยู่ และใช้ฐานข้อมูลในหน่วยความจําเพื่อจัดเก็บข้อมูล ถัดไป คุณจะได้เรียนรู้วิธีการใช้ฐานข้อมูลจริงเพื่อจัดเก็บข้อมูลเพื่อให้ยังคงอยู่ระหว่างการปิดแอปพลิเคชัน