Alıştırma - En düşük API'ye EF Core ekleme

Tamamlandı

Bir şirketin geliştiricisisiniz ve siz ve şirketiniz yeni minimal API'yi duydunuz. Yöneticiniz, bir sonraki projenizde kullanılıp kullanılmayacağını tartışabilmeniz için bunun için bir proje oluşturmanızı istedi.

Dekont

Bu modülde yerel geliştirme için .NET CLI (Komut Satırı Arabirimi) ve Visual Studio Code kullanılır. Bu modülü tamamladıktan sonra Visual Studio (Windows), Mac için Visual Studio (macOS) veya Visual Studio Code (Windows, Linux ve macOS) kullanarak geliştirmeye devam ederek kavramları uygulayabilirsiniz.

Bu modülde .NET 8.0 SDK kullanılır. Tercih ettiğiniz komut terminalinde aşağıdaki komutu çalıştırarak .NET 8.0'ın yüklü olduğundan emin olun:

dotnet --list-sdks

Aşağıdaki örneğe benzer bir çıkış görüntülenir:

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

ile 8 başlayan bir sürümün listelendiğinden emin olun. Hiçbiri listelenmiyorsa veya komut bulunamazsa en son .NET 8.0 SDK'sını yükleyin.

Projeyi ayarlama

İlk olarak bir proje oluşturmanız gerekir. .NET 6'yi yüklediniz ve başlamaya hazırsınız. Bu ünitede bir pizza yönetim API'sine veri kalıcılığı ekleyeceksiniz.

  1. Terminalde komutunu çalıştırarak dotnet newbir web API'si oluşturun:

    dotnet new web -o PizzaStore -f net8.0
    

    PizzaStore dizinini görmeniz gerekir.

  2. Aşağıdaki komutu girerek PizzaStore dizinine gidin:

    cd PizzaStore
    
  3. Swashbuckle paketini yükleyin:

    dotnet add package Swashbuckle.AspNetCore --version 6.5.0
    
  4. Projeyi Visual Studio Code'da açın.

  5. Visual Studio Code'u kullanarak proje kökünde bir Pizza.cs dosyası oluşturun ve bu dosyaya aşağıdaki içeriği verin:

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

    Yukarıdaki Pizza sınıf, pizzayı temsil eden basit bir nesnedir. Bu kod, veri modelinizdir. Daha sonra, bu veri modelini bir veritabanı tablosuyla eşlemek için Entity Framework (EF) Core kullanacaksınız.

  6. Program.cs dosyasını açın ve vurgulanan kodu ekleyin:

    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'dan projede hata ayıklamak için varlık ekleme istemi alabilirsiniz. İletişim kutusunda öğesini seçin Yes .

Projeye EF Core ekleme

Öğeleri yapılacaklar listesinde depolamak için paketi yükleyin EntityFrameworkCore.InMemory .

  1. Visual Studio Code'da bir terminal açmak için Ctrl+' tuşlarına basın. Yeni terminalde EF Core InMemory paketini eklemek için aşağıdaki kodu girin:

    dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 8.0
    
  2. Program.cs ve Pizza.cs dosyalarınızın en üstüne ekleyinusing Microsoft.EntityFrameworkCore;.

    Ef Core'un projeye eklendiğine göre, kodunuzu kaydetmek istediğiniz verilere aktarabilir ve sorgulayabilirsiniz. Bu adımı gerçekleştirmek için bir PizzaDb sınıf oluşturursunuz. PizzaDb sınıfı aşağıdaki görevleri gerçekleştirecektir:

    • Veritabanı listenizden özelliğinizi PizzasPizza kullanıma sunun.
    • Bellek içi veritabanı depolama alanını kabloyla göndermek için kullanın UseInMemoryDatabase . Uygulamanız çalıştığı sürece verileriniz burada depolanır.
  3. Bellek içi veritabanınızı ayarlamak için Pizza.cs dosyasının altına (son }dosyanın üstüne) aşağıdaki kodu ekleyin. Ad alanında iki sınıf tanımına PizzaStore.Models sahip olursunuz.

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

    DbContext , veritabanındaki varlık örneklerini sorgulamak ve kaydetmek için kullanılan bir bağlantıyı veya oturumu temsil eder.

  4. Program.cs dosyanızın en üstüne ekleyinusing PizzaStore.Models;.

  5. Program.cs dosyasında, çağrısından AddSwaggerGenönce aşağıdaki kodu ekleyin:

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

Öğe listesini döndürme

  • Pizza listesindeki öğeler listesinden okumak için çağrısının üzerine "/pizzas" yolu eklemek için app.Run(); aşağıdaki kodu ekleyin:

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

Uygulamayı çalıştırma

  1. Tüm değişikliklerinizi kaydettiğinizden emin olun. Terminalde arayarak dotnet run uygulamayı çalıştırın. Bu eylem uygulamayı oluşturur ve 5000-5300 arası bir bağlantı noktasında barındıracaktır. HTTPS için 7000-7300 aralığında bir bağlantı noktası seçilir.

    Dekont

    Rastgele bağlantı noktası seçimi davranışını geçersiz kılmak istiyorsanız, launch Ayarlar.json dosyasında kullanılacak bağlantı noktalarını ayarlayabilirsiniz.

    dotnet run
    

    Çıktının terminalde nasıl görünebileceği aşağıdadır:

    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. Tarayıcınızda https://localhost:{PORT}/swagger adresine gidin. Düğmeyi GET /pizzas seçin, ardından Deneyin ve Yürüt'e tıklayın. altında Response bodylistenin boş olduğunu görürsünüz.

  3. Terminalde, programı çalıştırmayı durdurmak için Ctrl+C tuşlarına basın.

Yeni öğe oluşturma

Şimdi kodu POST pizza listesine yeni öğelere ekleyelim. Program.cs'de, daha önce oluşturduğunuz kodun app.MapGet altına aşağıdaki kodu ekleyin.

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

API’yi test etme

Tüm değişikliklerinizi kaydettiğinizden ve uygulamayı yeniden çalıştırdığınızdan emin olun. Swagger kullanıcı arabirimine geri döndüğünüzde öğesini görmeniz POST/pizzagerekir. Pizza listesine yeni öğeler eklemek için:

  1. POST /pizza'ı seçin.

  2. Deneyin'i seçin.

  3. İstek gövdesini aşağıdaki JSON ile değiştirin:

    {
        "name": "Pepperoni",
        "description": "A classic pepperoni pizza"
    }
    
  4. Yürüt'ü seçin.

Listedeki öğeleri okumak için:

  1. GET /pizzas'ı seçin.

  2. Deneyin'i seçin.

  3. Yürüt'ü seçin.

    yeni Response body eklenen öğeleri içerir.

    [
      {
        "id": 1,
        "name": "Pepperoni",
        "description": "A classic pepperoni pizza"
      }
    ]
    
  4. Uygulamayı çalıştırmayı durdurmak için terminalde Ctrl+C tuşlarına basın. Bu alıştırmanın geri kalanında, değişikliklerinizi test etmek için uygulamayı istediğiniz şekilde durdurun ve yeniden başlatın. Tüm değişikliklerinizi sizden dotnet runönce kaydettiğinizden emin olun!

Tek bir öğe alma

öğesine göre idbir öğeyi ALMAK için, kodu daha önce oluşturduğunuz yolun altına app.MapPost ekleyin.

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

Kimliğine göre GET'i test edin

Bu işlemi test etmek için Swagger kullanıcı arabirimine https://localhost:{PORT}/pizza/1 gidebilir veya kullanabilirsiniz. Bellek içi veritabanı kullandığınızdan, uygulamayı yeniden başlattıysanız daha önce oluşturduğunuz pizza listelenmez. Bu nedenle, yeniden eklemek için POST işleminizi kullanmanız gerekir.

Öğeyi güncelleştirme

Mevcut bir öğeyi güncelleştirmek için kodu oluşturduğunuz yolun altına GET /pizza/{id} ekleyin:

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();
});

Test PUT

  1. Swagger kullanıcı arabiriminde PUT /pizza/{id} öğesini seçin.

  2. Deneyin'i seçin.

  3. Kimlik metin kutusuna 1 girin.

  4. Son olarak güncelleştirin Request body. Aşağıdaki JSON dosyasını yapıştırın ve olarak Pineappledeğiştirinname.

    {
       "id": 1,
       "name": "Pineapple"
    }
    
  5. Yürüt'ü seçin.

Kodu test etmek için bölümüne geri GET /pizza/{id}kaydırın. Pizzanın adı Pineappleartık .

Öğeyi silme

Var olan bir öğeyi silmek için, daha önce oluşturduğunuz öğenin altına PUT /pizza/{id} kodu ekleyin:

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'i test etme

Şimdi Swagger arabirimini kullanarak bir öğeyi silmeyi deneyin.

Bu ünitede EF Core'ı mevcut en düşük API uygulamasına eklediniz ve verileri depolamak için bellek içi bir veritabanı kullandınız. Ardından, uygulama kapatma işlemleri arasında kalıcı olması için verileri depolamak için gerçek bir veritabanını nasıl kullanacağınızı öğreneceksiniz.