Alıştırma - En düşük API'ye EF Core ekleme
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.
Terminalde
dotnet newçalıştırarak bir web API'si oluşturun:dotnet new web -o PizzaStore -f net8.0PizzaStore dizinini görmeniz gerekir.
Aşağıdaki komutu girerek PizzaStore dizinine gidin:
cd PizzaStoreSwashbuckle paketini yükleyin:
dotnet add package Swashbuckle.AspNetCore --version 6.5.0Projeyi Visual Studio Code'da açın.
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
Pizzası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.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
Yesseçin.
Projeye EF Core ekleme
öğeleri to-do listesinde depolamak için EntityFrameworkCore.InMemory paketini yükleyin.
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.0using 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
PizzaDbsınıfı oluşturursunuz.PizzaDbsınıfı aşağıdaki görevleri yapar:- Veritabanındaki
PizzaslistenizdekiPizzaözelliğinizi açığa çıkartın. -
UseInMemoryDatabasekullanarak bellek içi veritabanı depolama alanını bağla. Uygulamanız çalıştığı sürece verileriniz burada depolanır.
- Veritabanındaki
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.Modelsad 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.using PizzaStore.Models;dosyanızın en üstüne ekleyin.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
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>/PizzaStoreTarayıcınızda https://localhost:{PORT}/swagger’a gidin.
GET /pizzasdüğmesini seçin ve ardından deneyin ve Yürüt'e tıklayın.Response bodyaltında listenin boş olduğunu göreceksiniz.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:
POST /pizzaseçin.
Deneyinseçin.
İstek gövdesini aşağıdaki JSON ile değiştirin:
{ "name": "Pepperoni", "description": "A classic pepperoni pizza" }Yürüt'e tıklayın.
Listedeki öğeleri okumak için:
GET /pizzasseçin.
Deneyinseçin.
Yürüt'e tıklayın.
Response bodyyeni eklenen öğeleri içerir.[ { "id": 1, "name": "Pepperoni", "description": "A classic pepperoni pizza" } ]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
Swagger kullanıcı arabiriminde PUT /pizza/{id} öğesini seçin.
Deneyinseçin.
kimliği metin kutusuna 1yazın.
Son olarak
Request bodygüncelleştirin. Aşağıdaki JSON dosyasını yapıştırın venamePineappleolarak değiştirin.{ "id": 1, "name": "Pineapple" }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.