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.

Not

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 & macOS) kullanarak sürekli geliştirme kullanarak 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]

8 ile 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 dotnet newçalıştırarak bir 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 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 Yes seçin.

Projeye EF Core ekleme

öğeleri to-do listesinde depolamak için EntityFrameworkCore.InMemory paketini yükleyin.

  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. using Microsoft.EntityFrameworkCore; ve Pizza.cs dosyalarınızın en üstüne ekleyin.

    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 yapar:

    • Veritabanındaki Pizzas listenizdeki Pizza özelliğinizi açığa çıkartın.
    • UseInMemoryDatabase kullanarak bellek içi veritabanı depolama alanını bağla. Uygulamanız çalıştığı sürece verileriniz burada depolanır.
  3. Bellek içi veritabanınızı ayarlamak için, aşağıdaki kodu Pizza.cs dosyasının en altına (son }dosyanın üstüne) ekleyin. PizzaStore.Models ad alanında iki sınıf tanımına 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. using PizzaStore.Models; dosyanızın en üstüne ekleyin.

  5. Program.cs ç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 öğelerden okumak için app.Run(); çağrısından önce "/pizzas" yolunu eklemek amacıyla 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 dotnet run çağırarak uygulamayı çalıştırın. Bu işlem uygulamayı oluşturur ve 5000-5300 arası bir bağlantı noktasında barındırır. HTTPS için 7000-7300 aralığında bir bağlantı noktası seçilir.

    Not

    Rastgele bağlantı noktası seçimi davranışını geçersiz kılmak istiyorsanız, launchSettings.jsoniçinde 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’a gidin. GET /pizzas düğmesini seçin ve ardından deneyin ve Yürüt'e tıklayın. Response bodyaltında listenin boş olduğunu göreceksiniz.

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

Yeni öğe oluşturma

Şimdi kodu pizza listesine yeni öğeler POST ekleyelim. Program.cs'da, 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 edin

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 POST/pizzagörmeniz gerekir. Pizza listesine yeni öğeler eklemek için:

  1. POST /pizzaseçin.

  2. Deneyinseçin.

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

    {
        "name": "Pepperoni",
        "description": "A classic pepperoni pizza"
    }
    
  4. Yürüt'e tıklayın.

Listedeki öğeleri okumak için:

  1. GET /pizzasseçin.

  2. Deneyinseçin.

  3. Yürüt'e tıklayın.

    Response body yeni 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. dotnet runyapmadan önce tüm değişikliklerinizi kaydettiğinizden emin olun!

Tek bir öğe al

Bir öğeyi GET id ile almak için, kodu daha önce oluşturduğunuz app.MapPost yolunun altına 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 https://localhost:{PORT}/pizza/1 gidebilir veya Swagger kullanıcı arabirimini 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 GET /pizza/{id} yolunun altına 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. Deneyinseçin.

  3. kimliği metin kutusuna 1yazın.

  4. Son olarak Request bodygüncelleştirin. Aşağıdaki JSON dosyasını yapıştırın ve namePineappleolarak değiştirin.

    {
       "id": 1,
       "name": "Pineapple"
    }
    
  5. Yürüt'e tıklayın.

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

Öğe silme

Var olan bir öğeyi silmek için, kodu daha önce oluşturduğunuz PUT /pizza/{id} altına 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.