Alıştırma - Geçiş ayarlama

Tamamlandı

Bu ünitede, yerel SQLite veritabanındaki tablolarla eşlenecek C# varlık sınıfları oluşturacaksınız. EF Core geçişleri özelliği, bu varlıklardan tablolar oluşturur.

Geçiş, veritabanı şemasını artımlı olarak güncelleştirmenin bir yolunu sağlar.

Proje dosyalarını alma

Başlamak için proje dosyalarını alın. Proje dosyalarını nasıl edindiğinize ilişkin bazı seçenekleriniz vardır:

  • GitHub Codespaces kullanma
  • GitHub deposunu kopyalama

Uyumlu bir kapsayıcı çalışma zamanı yüklüyse, depoyu önceden yüklenmiş araçlarla bir kapsayıcıda açmak için Dev Kapsayıcıları uzantısını da kullanabilirsiniz.

GitHub Codespaces kullanma

Kod alanı, bulutta barındırılan bir IDE'dir. GitHub Codespaces kullanıyorsanız tarayıcınızda depoya gidin. Kod'u seçin ve dalda main yeni bir kod alanı oluşturun.

GitHub deposunu kopyalama

GitHub Codespaces kullanmıyorsanız proje GitHub deposunu kopyalayabilir ve ardından dosyaları Visual Studio Code'da klasör olarak açabilirsiniz.

  1. Bir komut terminali açın ve ardından komut istemini kullanarak projeyi GitHub'dan kopyalayın:

    git clone https://github.com/MicrosoftDocs/mslearn-persist-data-ef-core
    
  2. mslearn-persist-data-ef-core klasörüne gidin ve projeyi Visual Studio Code açın:

    cd mslearn-persist-data-ef-core
    code .
    

Kodu gözden geçirin

Artık çalışabileceğiniz proje dosyalarına sahipsiniz. Projede neler olduğunu görün ve kodu gözden geçirin.

  • bir ASP.NET Core web API'si olan proje ContosoPizza dizininde bulunur. Bu modülde başvuruda bulunılan dosya yolları ContosoPizza dizinine göredir.
  • Services/PizzaService.cs oluşturma, okuma, güncelleştirme ve silme (CRUD) yöntemlerini tanımlayan bir hizmet sınıfıdır. Şu anda tüm yöntemler oluşturur System.NotImplementedException.
  • Program.cs dosyasında, PizzaService ASP.NET Core bağımlılık ekleme sistemine kaydedilir.
  • Controllers/PizzaController.cs , HTTP POST, GET, PUT ve DELETE fiilleri için bir uç noktayı kullanıma sunan bir değerdir ApiController . Bu fiiller üzerinde PizzaServicekarşılık gelen CRUD yöntemlerini çağırır. PizzaService oluşturucuya PizzaController eklenir.
  • Models klasörü ve PizzaControllertarafından PizzaService kullanılan modelleri içerir.
  • Pizza.cs, Topping.cs ve Sauce.cs varlık modelleri aşağıdaki ilişkilere sahiptir:
    • Pizzada bir veya daha fazla topping olabilir.
    • Bir topping bir veya birçok pizza üzerinde kullanılabilir.
    • Pizzada bir sos olabilir, ancak birçok pizzada bir sos kullanılabilir.

Uygulamayı oluşturma

Uygulamayı Visual Studio Code'da oluşturmak için:

  1. Gezgin bölmesinde ContosoPizza dizinine sağ tıklayın ve Tümleşik Terminalde Aç'ı seçin.

    Kapsamı ContosoPizza dizini olarak belirlenmiş bir terminal bölmesi açılır.

  2. Aşağıdaki komutu kullanarak uygulamayı oluşturun:

    dotnet build
    

    Kod hiçbir uyarı veya hata olmadan derlenmelidir.

NuGet paketleri ve EF Core araçları ekleme

Bu modülde birlikte çalıştığınız veritabanı altyapısı SQLite'tir. SQLite, basit, dosya tabanlı bir veritabanı altyapısıdır. Geliştirme ve test için iyi bir seçimdir ve küçük ölçekli üretim dağıtımları için de iyi bir seçimdir.

Not

Daha önce belirtildiği gibi EF Core'daki veritabanı sağlayıcıları eklenebilir. SQLite, hafif ve platformlar arası olduğundan bu modül için iyi bir seçimdir. SQL Server ve PostgreSQL gibi farklı veritabanı altyapılarıyla çalışmak için aynı kodu kullanabilirsiniz. Aynı uygulamada birden çok veritabanı altyapısı bile kullanabilirsiniz.

Başlamadan önce gerekli paketleri ekleyin:

  1. Terminal bölmesinde aşağıdaki komutu çalıştırın:

    dotnet add package Microsoft.EntityFrameworkCore.Sqlite
    

    Bu komut, EF Core SQLite veritabanı sağlayıcısını ve ortak EF Core hizmetleri de dahil olmak üzere tüm bağımlılıklarını içeren NuGet paketini ekler.

  2. Şu komutu çalıştırın:

    dotnet add package Microsoft.EntityFrameworkCore.Design
    

    Bu komut, EF Core araçları için gereken paketleri ekler.

  3. Bitirmek için şu komutu çalıştırın:

    dotnet tool install --global dotnet-ef
    

    Bu komut, geçişler dotnet efve yapı iskelesi oluşturmak için kullanacağınız aracı yükler.

    İpucu

    zaten yüklüyse dotnet ef komutunu çalıştırarak dotnet tool update --global dotnet-efgüncelleştirebilirsiniz.

yapı iskelesi modelleri ve DbContext

Şimdi bir DbContext uygulama ekleyip yapılandıracaksınız. DbContext , veritabanıyla etkileşim kurabileceğiniz bir ağ geçididir.

  1. ContosoPizza dizinine sağ tıklayın ve Veri adlı yeni bir klasör ekleyin.

  2. Veri klasöründe PizzaContext.cs adlı yeni bir dosya oluşturun. Boş dosyaya aşağıdaki kodu ekleyin:

    using Microsoft.EntityFrameworkCore;
    using ContosoPizza.Models;
    
    namespace ContosoPizza.Data;
    
    public class PizzaContext : DbContext
    {
        public PizzaContext (DbContextOptions<PizzaContext> options)
            : base(options)
        {
        }
    
        public DbSet<Pizza> Pizzas => Set<Pizza>();
        public DbSet<Topping> Toppings => Set<Topping>();
        public DbSet<Sauce> Sauces => Set<Sauce>();
    }
    

    Yukarıdaki kodda:

    • Oluşturucu türündeki DbContextOptions<PizzaContext>bir parametreyi kabul eder. Oluşturucu, aynı kodun test ve üretim kodu arasında paylaşılabilmesi ve hatta farklı sağlayıcılarla kullanılabilmesi için dış kodun yapılandırmayı DbContext geçirmesine izin verir.
    • Özellikler, DbSet<T> veritabanında oluşturulacak tablolara karşılık gelir.
    • Tablo adları PizzaContext sınıfındaki DbSet<T> özellik adları ile eşleşir. Gerekirse bu davranışı geçersiz kılabilirsiniz.
    • Örneği oluşturulduğunda PizzaContext , Toppingsve Sauces özelliklerini kullanıma sunarPizzas. Bu özellikler tarafından kullanıma sunulan koleksiyonlarda yaptığınız değişiklikler veritabanına yayılır.
  3. Program.cs dosyasında değerini aşağıdaki kodla değiştirin// Add the PizzaContext:

    builder.Services.AddSqlite<PizzaContext>("Data Source=ContosoPizza.db");
    

    Yukarıdaki kod:

    • PizzaContext ASP.NET Core bağımlılık ekleme sistemine kaydolur.
    • PizzaContext SQLite veritabanı sağlayıcısını kullanacağını belirtir.
    • ContosoPizza.db adlı yerel bir dosyaya işaret eden bir SQLite bağlantı dizesi tanımlar.

    Not

    SQLite yerel veritabanı dosyalarını kullandığından bağlantı dizesini sabit kodlamak büyük olasılıkla sorun olmaz. PostgreSQL ve SQL Server gibi ağ veritabanları için bağlantı dizelerinizi her zaman güvenli bir şekilde depolamanız gerekir. Yerel geliştirme için Gizli Dizi Yöneticisi'ni kullanın. Üretim dağıtımları için Azure Key Vault gibi bir hizmet kullanmayı göz önünde bulundurun.

  4. Ayrıca Program.cs dosyasında değerini aşağıdaki kodla değiştirin // Additional using declarations .

    using ContosoPizza.Data;
    

    Bu kod, önceki adımda bağımlılıkları çözer.

  5. Yaptığınız tüm değişiklikleri kaydedin. GitHub Codespaces değişikliklerinizi otomatik olarak kaydeder.

  6. komutunu çalıştırarak dotnet builduygulamayı terminalde oluşturun. Derleme hiçbir uyarı veya hata olmadan başarılı olmalıdır.

Geçiş oluşturma ve çalıştırma

Ardından, ilk veritabanınızı oluşturmak için kullanabileceğiniz bir geçiş oluşturun.

  1. Veritabanı tablolarının oluşturulmasına yönelik geçişi üretmek için aşağıdaki komutu çalıştırın:

    dotnet ef migrations add InitialCreate --context PizzaContext
    

    Yukarıdaki komutta:

    • Geçişe InitialCreate adı verilir.
    • --context seçeneği, ContosoPizza projesinde DbContext öğesinden türetilen sınıfın adını belirtir.

    ContosoPizza proje kökünde yeni Migrations dizini görüntülenir. Dizin, Veri Tanımı Dili (DDL) değişiklik betiğine çevrilecek veritabanı değişikliklerini açıklayan bir dosya içerir <timestamp>_InitialCreate.cs .

  2. InitialCreate geçişini uygulamak için aşağıdaki komutu çalıştırın:

    dotnet ef database update --context PizzaContext
    

    Bu komut geçişi uygular. ContosoPizza.db yok, bu nedenle geçiş proje dizininde oluşturulur.

    İpucu

    dotnet ef aracı tüm platformlarda desteklenir. Windows üzerinde Visual Studio'da tümleşik Paket Yöneticisi Konsolu penceresinde ve Update-Database PowerShell cmdlet'lerini kullanabilirsinizAdd-Migration.

Veritabanını inceleme

EF Core uygulamanız için bir veritabanı oluşturdu. Ardından SQLite uzantısını kullanarak veritabanının içine göz atın.

  1. Gezgin bölmesinde ContosoPizza.db dosyasına sağ tıklayın ve Veritabanını Aç'ı seçin.

    Visual Studio Code Gezgini bölmesindeki Veritabanını Aç menü seçeneğini gösteren ekran görüntüsü.

    Gezgin bölmesinde bir SQLite Explorer klasörü görünür.

    Gezgin bölmesindeki SQLite Explorer klasörünü gösteren ekran görüntüsü.

  2. Düğümü ve tüm alt düğümlerini genişletmek için SQLite Gezgini klasörünü seçin. Geçişin oluşturduğu tam veritabanı şemasını ve kısıtlamalarını görüntülemek için ContosoPizza.db'ye sağ tıklayın ve Tabloyu Göster 'sqlite_master' öğesini seçin.

    Gezgin bölmesinde genişletilmiş SQLite Explorer klasörünü gösteren ekran görüntüsü.

    • Her varlığa karşılık gelen tablolar oluşturuldu.
    • Tablo adları üzerindeki PizzaContextözelliklerin DbSet adlarından alınmıştır.
    • adlı Id özelliklerin birincil anahtar alanlarını otomatik olarak suçlayan olduğu ortaya çıkarılmıştır.
    • EF Core birincil anahtarı ve yabancı anahtar kısıtlama adlandırma kuralları sırasıyla ve FK_<dependent entity>_<principal entity>_<foreign key property>şeklindedirPK_<primary key property>. <dependent entity> ve <principal entity> yer tutucuları varlık sınıfı adlarına karşılık gelir.

    Not

    ASP.NET Core MVC gibi EF Core da yapılandırma yaklaşımı üzerinde bir kural kullanır. EF Core kuralları, geliştiricinin amacına yönelik çıkarsamalar yaparak geliştirme süresini kısaltır. Örneğin, Id veya <entity name>Id adlı bir özellik, oluşturulan tablonun birincil anahtarı olarak çıkarsanır. Adlandırma kuralını benimsememeyi seçerseniz özelliğine özniteliğiyle [Key] ek açıklama eklenmelidir veya yönteminde OnModelCreatingDbContextanahtar olarak yapılandırılmalıdır.

Modeli değiştirme ve veritabanı şemasını güncelleştirme

Contoso Pizza'daki yöneticiniz size bazı yeni gereksinimler sunar, bu nedenle varlık modellerinizi değiştirmeniz gerekir. Aşağıdaki adımlarda eşleme özniteliklerini ( bazen veri ek açıklamaları olarak adlandırılır) kullanarak modelleri değiştirirsiniz.

  1. Models\Pizza.cs dosyasında aşağıdaki değişiklikleri yapın:

    1. için System.ComponentModel.DataAnnotationsbir using yönerge ekleyin.
    2. Özelliği gerekli olarak işaretlemek için özelliğinden önce Name bir [Required] öznitelik ekleyin.
    3. En fazla 100 dize uzunluğu belirtmek için özelliğinden önce Name bir [MaxLength(100)] öznitelik ekleyin.
    using System.ComponentModel.DataAnnotations;
    
    namespace ContosoPizza.Models;
    
    public class Pizza
    {
        public int Id { get; set; }
    
        [Required]
        [MaxLength(100)]
        public string? Name { get; set; }
    
        public Sauce? Sauce { get; set; }
    
        public ICollection<Topping>? Toppings { get; set; }
    }
    
  2. Models\Sauce.cs dosyasında aşağıdaki değişiklikleri yapın:

    1. için System.ComponentModel.DataAnnotationsbir using yönerge ekleyin.
    2. Özelliği gerekli olarak işaretlemek için özelliğinden önce Name bir [Required] öznitelik ekleyin.
    3. En fazla 100 dize uzunluğu belirtmek için özelliğinden önce Name bir [MaxLength(100)] öznitelik ekleyin.
    4. adlı IsVeganbir bool özellik ekleyin.
    using System.ComponentModel.DataAnnotations;
    
    namespace ContosoPizza.Models;
    
    public class Sauce
    {
        public int Id { get; set; }
    
        [Required]
        [MaxLength(100)]
        public string? Name { get; set; }
    
        public bool IsVegan { get; set; }
    }
    
  3. Models\Topping.cs dosyasında aşağıdaki değişiklikleri yapın:

    1. ve System.Text.Json.Serializationiçin System.ComponentModel.DataAnnotations yönergeleri ekleyinusing.
    2. Özelliği gerekli olarak işaretlemek için özelliğinden önce Name bir [Required] öznitelik ekleyin.
    3. En fazla 100 dize uzunluğu belirtmek için özelliğinden önce Name bir [MaxLength(100)] öznitelik ekleyin.
    4. özelliğinden hemen sonra Name adlı Calories bir decimal özellik ekleyin.
    5. Pizzas Çoka çok ilişki oluşturmak Pizza-Topping için türünde ICollection<Pizza>? bir özellik ekleyin.
    6. özelliğine Pizzas bir [JsonIgnore] öznitelik ekleyin.

    Önemli

    Bu adımlar, web API kodu JSON'a yanıtı seri hale getirdiğinde varlıkların özelliğini dahil Pizzas etmesini engellerTopping. Bu değişiklik olmadan, serileştirilmiş bir topping koleksiyonu, topping kullanan her pizzanın bir koleksiyonunu içerir. Bu koleksiyondaki her pizza, yine bir pizza koleksiyonu içeren bir topping koleksiyonu içerir. Bu sonsuz döngü türü döngüsel başvuru olarak adlandırılır ve serileştirilemez.

    using System.ComponentModel.DataAnnotations;
    using System.Text.Json.Serialization;
    
    namespace ContosoPizza.Models;
    
    public class Topping
    {
        public int Id { get; set; }
    
        [Required]
        [MaxLength(100)]
        public string? Name { get; set; }
    
        public decimal Calories { get; set; }
    
        [JsonIgnore]
        public ICollection<Pizza>? Pizzas { get; set; }
    }
    
  4. Tüm değişikliklerinizi kaydedin ve komutunu çalıştırın dotnet build.

  5. Veritabanı tablolarının oluşturulmasına yönelik geçişi üretmek için aşağıdaki komutu çalıştırın:

    dotnet ef migrations add ModelRevisions --context PizzaContext
    

    adlı ModelRevisions bir geçiş oluşturulur.

    Not

    Bu ileti görüntülenir: Veri kaybına neden olabilecek bir işlem iskelesi oluşturulmuş. Lütfen doğruluğu için geçişi gözden geçirin. var olan bir yabancı anahtar sütununun bırakılması için ilişkiyi PizzaTopping bire çok olandan çoka çok olarak değiştirdiğiniz için ileti görüntülenir. Veritabanınızda henüz veri olmadığından bu değişiklik sorunlu değildir. Ancak, genel olarak, bu uyarı görüntülendiğinde oluşturulan geçişi denetleyerek geçiş tarafından hiçbir verinin silinmediğinden veya kesilmediğinden emin olmak iyi bir fikirdir.

  6. ModelRevisions geçişini uygulamak için aşağıdaki komutu çalıştırın:

    dotnet ef database update --context PizzaContext
    
  7. SQLite Explorer klasörünün başlık çubuğunda Veritabanlarını Yenile düğmesini seçin.

    SQLite Gezgini'nin başlık çubuğundaki Veritabanlarını Yenile düğmesini gösteren ekran görüntüsü.

  8. SQLite Gezgini klasöründe ContosoPizza.db'ye sağ tıklayın. Tam veritabanı şemasını ve kısıtlamalarını görüntülemek için 'sqlite_master' Tablosunu Göster'i seçin.

    Önemli

    SQLite uzantısı açık SQLite sekmelerini yeniden kullanıyor.

    • PizzaTopping Pizzalar ve topping'ler arasındaki çoka çok ilişkisini temsil eden bir birleştirme tablosu oluşturuldu.
    • ve Saucesöğesine yeni alanlar eklendiToppings.
      • Calories sütun olarak text tanımlanır çünkü SQLite'in eşleşen decimal bir türü yoktur.
      • Benzer şekilde, IsVegan sütun integer olarak tanımlanır. SQLite bir bool tür tanımlamaz.
      • Her iki durumda da ÇEVIRI EF Core tarafından yönetilebilir.
    • Name Her tablodaki sütun olarak işaretlendinot null, ancak SQLite'te bir MaxLength kısıtlama yoktur.

    İpucu

    EF Core veritabanı sağlayıcıları, model şemasını belirli bir veritabanının özellikleriyle eşler. SQLite için MaxLengthkarşılık gelen bir kısıtlama uygulamasa da, SQL Server ve PostgreSQL gibi diğer veritabanları bunu yapar.

  9. SQLite Gezgini klasöründe tabloya _EFMigrationsHistory sağ tıklayın ve Tabloyu Göster'i seçin. Tablo, veritabanına uygulanan tüm geçişlerin listesini içerir. İki geçiş çalıştırdığınız için iki giriş vardır: biri InitialCreate geçişi için, diğeri de ModelRevisions için.

Not

Bu alıştırmada, modelleri veritabanına eşlemek için eşleme öznitelikleri (veri ek açıklamaları) kullanıldı. Eşleme özniteliklerine alternatif olarak, modelleri yapılandırmak için ModelBuilder fluent API'sini kullanabilirsiniz. Her iki yaklaşım da geçerlidir, ancak bazı geliştiriciler bir yaklaşımı diğerine tercih eder.

Veritabanı şemasını tanımlamak ve güncelleştirmek için geçişleri kullandınız. Sonraki ünitede, verileri işleyen yöntemleri PizzaService tamamlayacaksınız.

Bilginizi ölçün

1.

Bir varlık sınıfında birincil anahtar için özellik adlandırma kuralı nedir?