Alıştırma - Geçiş ayarlama
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.
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
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 üzerindePizzaService
karşılık gelen CRUD yöntemlerini çağırır.PizzaService
oluşturucuyaPizzaController
eklenir. -
Models klasörü ve
PizzaController
tarafındanPizzaService
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:
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.
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:
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.
Şu komutu çalıştırın:
dotnet add package Microsoft.EntityFrameworkCore.Design
Bu komut, EF Core araçları için gereken paketleri ekler.
Bitirmek için şu komutu çalıştırın:
dotnet tool install --global dotnet-ef
Bu komut, geçişler
dotnet ef
ve yapı iskelesi oluşturmak için kullanacağınız aracı yükler.İpucu
zaten yüklüyse
dotnet ef
komutunu çalıştırarakdotnet tool update --global dotnet-ef
gü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.
ContosoPizza dizinine sağ tıklayın ve Veri adlı yeni bir klasör ekleyin.
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ındakiDbSet<T>
özellik adları ile eşleşir. Gerekirse bu davranışı geçersiz kılabilirsiniz. - Örneği oluşturulduğunda
PizzaContext
,Toppings
veSauces
özelliklerini kullanıma sunarPizzas
. Bu özellikler tarafından kullanıma sunulan koleksiyonlarda yaptığınız değişiklikler veritabanına yayılır.
- Oluşturucu türündeki
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.
-
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.
Yaptığınız tüm değişiklikleri kaydedin. GitHub Codespaces değişikliklerinizi otomatik olarak kaydeder.
komutunu çalıştırarak
dotnet build
uygulamayı 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.
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 projesindeDbContext
öğ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 .
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 veUpdate-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.
Gezgin bölmesinde ContosoPizza.db dosyasına sağ tıklayın ve Veritabanını Aç'ı seçin.
Gezgin bölmesinde bir SQLite Explorer klasörü görünür.
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.
- Her varlığa karşılık gelen tablolar oluşturuldu.
- Tablo adları üzerindeki
PizzaContext
özelliklerinDbSet
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öntemindeOnModelCreating
DbContext
anahtar 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.
Models\Pizza.cs dosyasında aşağıdaki değişiklikleri yapın:
- için
System.ComponentModel.DataAnnotations
birusing
yönerge ekleyin. - Özelliği gerekli olarak işaretlemek için özelliğinden önce
Name
bir[Required]
öznitelik ekleyin. - 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; } }
- için
Models\Sauce.cs dosyasında aşağıdaki değişiklikleri yapın:
- için
System.ComponentModel.DataAnnotations
birusing
yönerge ekleyin. - Özelliği gerekli olarak işaretlemek için özelliğinden önce
Name
bir[Required]
öznitelik ekleyin. - En fazla 100 dize uzunluğu belirtmek için özelliğinden önce
Name
bir[MaxLength(100)]
öznitelik ekleyin. - adlı
IsVegan
birbool
ö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; } }
- için
Models\Topping.cs dosyasında aşağıdaki değişiklikleri yapın:
- ve
System.Text.Json.Serialization
içinSystem.ComponentModel.DataAnnotations
yönergeleri ekleyinusing
. - Özelliği gerekli olarak işaretlemek için özelliğinden önce
Name
bir[Required]
öznitelik ekleyin. - En fazla 100 dize uzunluğu belirtmek için özelliğinden önce
Name
bir[MaxLength(100)]
öznitelik ekleyin. - özelliğinden hemen sonra
Name
adlıCalories
birdecimal
özellik ekleyin. -
Pizzas
Çoka çok ilişki oluşturmakPizza
-Topping
için türündeICollection<Pizza>?
bir özellik ekleyin. - ö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; } }
- ve
Tüm değişikliklerinizi kaydedin ve komutunu çalıştırın
dotnet build
.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
Pizza
Topping
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.ModelRevisions geçişini uygulamak için aşağıdaki komutu çalıştırın:
dotnet ef database update --context PizzaContext
SQLite Explorer klasörünün başlık çubuğunda Veritabanlarını Yenile düğmesini seçin.
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 olaraktext
tanımlanır çünkü SQLite'in eşleşendecimal
bir türü yoktur. - Benzer şekilde,
IsVegan
sütuninteger
olarak tanımlanır. SQLite birbool
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 birMaxLength
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
MaxLength
karşılık gelen bir kısıtlama uygulamasa da, SQL Server ve PostgreSQL gibi diğer veritabanları bunu yapar.-
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.