Bu video ve adım adım izlenecek yol, yeni veritabanını hedefleyen Code First geliştirmesine giriş sağlar. Bu senaryo, var olmayan bir veritabanını hedeflemeyi ve Önce Kod'un oluşturmasını veya Code First'un yeni tablolar ekleyeceğini boş bir veritabanını içerir. Code First, C# veya VB.Net sınıflarını kullanarak modelinizi tanımlamanızı sağlar. İsteğe bağlı olarak, sınıf ve özelliklerinizdeki öznitelikler kullanılarak veya akıcı bir API kullanılarak ek yapılandırma gerçekleştirilebilir.
Videoyu izleme
Bu video, yeni bir veritabanını hedefleyen Code First geliştirmesine giriş sağlar. Bu senaryo, var olmayan bir veritabanını hedeflemeyi ve Önce Kod'un oluşturmasını veya Code First'un yeni tablolar ekleyeceğini boş bir veritabanını içerir. Code First, C# veya VB.Net sınıflarını kullanarak modelinizi tanımlamanızı sağlar. İsteğe bağlı olarak, sınıf ve özelliklerinizdeki öznitelikler kullanılarak veya akıcı bir API kullanılarak ek yapılandırma gerçekleştirilebilir.
İşleri basit tutmak için, veri erişimi gerçekleştirmek için Önce Kod kullanan temel bir konsol uygulaması oluşturacağız.
Visual Studio’yu açın
Dosya -> Yeni -> Proje...
Sol menüden Ve Konsol Uygulaması'ndan Windows'ı seçin
Ad olarak CodeFirstNewDatabaseSample girin
Tamam'ı seçin
2. Modeli Oluşturma
Şimdi sınıfları kullanarak çok basit bir model tanımlayalım. Bunları Program.cs dosyasında tanımlıyoruz ancak gerçek bir dünya uygulamasında sınıflarınızı ayrı dosyalara ve potansiyel olarak ayrı bir projeye bölebilirsiniz.
Program.cs dosyasındaki Program sınıfı tanımının altına aşağıdaki iki sınıfı ekleyin.
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public virtual List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
İki gezinti özelliğini (Blog.Posts ve Post.Blog) sanal hale getirebileceğimizi fark edeceksiniz. Bu, Entity Framework'ün Gecikmeli Yükleme özelliğini etkinleştirir. Gecikmeli Yükleme, bu özelliklere erişmeye çalıştığınızda bu özelliklerin içeriğinin veritabanından otomatik olarak yüklendiği anlamına gelir.
3. Bağlam Oluşturma
Şimdi veritabanıyla bir oturumu temsil eden ve verileri sorgulamamıza ve kaydetmemize olanak tanıyan türetilmiş bir bağlam tanımlamanın zamanı geldi. System.Data.Entity.DbContext'ten türetilen ve modelimizdeki her sınıf için türetilmiş bir DbSet<TEntity'i> kullanıma sunan bir bağlam tanımlarız.
Entity Framework'ten türleri kullanmaya başladığımız için EntityFramework NuGet paketini eklememiz gerekiyor.
Program.cs dosyasının en üstüne System.Data.Entity için bir using deyimi ekleyin.
using System.Data.Entity;
Program.cs'deki Post sınıfının altına aşağıdaki türetilmiş bağlamı ekleyin.
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
Program.cs dosyasının şimdi içermesi gerekenlerin tam listesi aşağıdadır.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
namespace CodeFirstNewDatabaseSample
{
class Program
{
static void Main(string[] args)
{
}
}
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public virtual List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
}
Verileri depolamaya ve almaya başlamak için gereken tüm kod bu kadardır. Açıkçası perde arkasında oldukça fazla bir şey var ve bir dakika içinde buna göz atacağız ama önce nasıl çalıştığını görelim.
4. Veri Okuma ve Yazma
Aşağıda gösterildiği gibi Program.cs dosyasında Main yöntemini uygulayın. Bu kod bağlamımızın yeni bir örneğini oluşturur ve ardından bunu kullanarak yeni bir Blog ekler. Ardından, veritabanındaki tüm Blogları Başlığa göre alfabetik olarak sıralanmış olarak almak için bir LINQ sorgusu kullanır.
class Program
{
static void Main(string[] args)
{
using (var db = new BloggingContext())
{
// Create and save a new Blog
Console.Write("Enter a name for a new Blog: ");
var name = Console.ReadLine();
var blog = new Blog { Name = name };
db.Blogs.Add(blog);
db.SaveChanges();
// Display all Blogs from the database
var query = from b in db.Blogs
orderby b.Name
select b;
Console.WriteLine("All blogs in the database:");
foreach (var item in query)
{
Console.WriteLine(item.Name);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
Artık uygulamayı çalıştırabilir ve test edebilirsiniz.
Enter a name for a new Blog: ADO.NET Blog
All blogs in the database:
ADO.NET Blog
Press any key to exit...
Verilerim nerede?
Kural gereği DbContext sizin için bir veritabanı oluşturmuştur.
Yerel bir SQL Express örneği varsa (varsayılan olarak Visual Studio 2010 ile yüklenir) Code First söz konusu örnekte veritabanını oluşturmuştur
SQL Express kullanılamıyorsa Code First, LocalDB'yi dener ve kullanır (visual studio 2012 ile varsayılan olarak yüklenir)
Veritabanı, türetilmiş bağlamın tam adından sonra adlandırılır; bizim örneğimizde CodeFirstNewDatabaseSample.BloggingContext
Bunlar yalnızca varsayılan kurallardır ve Code First tarafından kullanılan veritabanını değiştirmenin çeşitli yolları vardır. DbContext Model ve Veritabanı Bağlan ion'ını Bulma konusunda daha fazla bilgi sağlanır.
Visual Studio'da Sunucu Gezgini'ne kullanarak bu veritabanına bağlanabilirsiniz
Görünüm -> Sunucu Gezgini
Veri Bağlan ions'a sağ tıklayın ve Bağlan ekle... öğesini seçin.
Veri kaynağı olarak Microsoft SQL Server'ı seçmeniz gerekmeden önce Sunucu Gezgini'nden bir veritabanına bağlanmadıysanız
Hangisini yüklediğinize bağlı olarak LocalDB veya SQL Express'e Bağlan
Artık Code First tarafından oluşturulan şemayı inceleyebiliriz.
DbContext, tanımladığımız DbSet özelliklerine bakarak modele hangi sınıfların dahil edilmesi gerekenleri çözdü. Ardından, tablo ve sütun adlarını belirlemek, veri türlerini belirlemek, birincil anahtarları bulmak vb. için varsayılan Code First kuralları kümesini kullanır. Bu kılavuzun ilerleyen bölümlerinde bu kuralları nasıl geçersiz kılabileceğinizi inceleyeceğiz.
5. Model Değişiklikleriyle ilgilenme
Şimdi modelimizde bazı değişiklikler yapma zamanı geldi. Bu değişiklikleri yaptığımızda veritabanı şemasını da güncelleştirmemiz gerekiyor. Bunu yapmak için Code First Migrations adlı bir özelliği veya kısaca Geçişler'i kullanacağız.
Geçişler, veritabanı şemamızı yükseltmeyi (ve düşürmeyi) açıklayan sıralı bir adım kümesine sahip olmamızı sağlar. Geçiş olarak bilinen bu adımların her biri, uygulanacak değişiklikleri açıklayan bazı kodlar içerir.
İlk adım, BloggingContext'imiz için Code First Migrations'ı etkinleştirmektir.
Projemize iki öğe içeren yeni bir Migrations klasörü eklendi:
Configuration.cs – Bu dosya, Migrations'ın BloggingContext'i geçirmek için kullanacağı ayarları içerir. Bu kılavuz için hiçbir şeyi değiştirmemiz gerekmez, ancak burada tohum verilerini belirtebilir, diğer veritabanları için sağlayıcı kaydedebilir, geçişlerin oluşturulduğu ad alanını vb. değiştirebilirsiniz.
<timestamp>_InitialCreate.cs – Bu ilk geçişinizdir; boş bir veritabanı olmaktan çıkıp Bloglar ve Gönderiler tablolarını içeren veritabanına zaten uygulanmış olan değişiklikleri temsil eder. Code First'un bu tabloları bizim için otomatik olarak oluşturmasına izin vermemize rağmen, artık Geçişler'i kabul ettiğimize göre bunlar Geçişe dönüştürüldü. Code First, yerel veritabanımızda bu Geçişin zaten uygulandığını da kaydetmiştir. Dosya adındaki zaman damgası, sıralama amacıyla kullanılır.
Şimdi modelimizde bir değişiklik yapalım, Blog sınıfına bir Url özelliği ekleyelim:
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public virtual List<Post> Posts { get; set; }
}
Paket Yöneticisi Konsolu'nda Add-Migration AddUrl komutunu çalıştırın.
Geçiş Ekle komutu, son geçişinizden bu yana yapılan değişiklikleri denetler ve bulunan tüm değişikliklerle yeni bir geçişin iskelesini oluşturur. Geçişlere bir ad verebiliriz; bu durumda geçişi 'AddUrl' olarak adlandırıyoruz.
yapı iskelesi oluşturulmuş kod, dbo'ya dize verilerini tutabilen bir Url sütunu eklememiz gerektiğini söylüyor. Bloglar tablosu. Gerekirse, iskelesi oluşturulmuş kodu düzenleyebiliriz, ancak bu durumda gerekli değildir.
namespace CodeFirstNewDatabaseSample.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddUrl : DbMigration
{
public override void Up()
{
AddColumn("dbo.Blogs", "Url", c => c.String());
}
public override void Down()
{
DropColumn("dbo.Blogs", "Url");
}
}
}
Paket Yöneticisi Konsolu'nda Update-Database komutunu çalıştırın. Bu komut, bekleyen tüm geçişleri veritabanına uygular. InitialCreate geçişimiz zaten uygulanmış olduğundan, geçişler yalnızca yeni AddUrl geçişimizi uygular.
İpucu: Veritabanında yürütülen SQL'i görmek için Update-Database'i çağırırken –Verbose anahtarını kullanabilirsiniz.
Yeni Url sütunu artık veritabanındaki Bloglar tablosuna eklenir:
6. Veri Ek Açıklamaları
Şu ana kadar EF'nin varsayılan kurallarını kullanarak modeli keşfetmesine izin verdik, ancak bazı durumlarda sınıflarımız kuralları izlemez ve daha fazla yapılandırma gerçekleştirebilmemiz gerekir. Bunun için iki seçenek vardır; Bu bölümde Veri Ek Açıklamaları'nı ve sonraki bölümde akıcı API'yi inceleyeceğiz.
Şimdi modelimize bir Kullanıcı sınıfı ekleyelim
public class User
{
public string Username { get; set; }
public string DisplayName { get; set; }
}
Ayrıca türetilmiş bağlamımıza bir küme eklememiz gerekiyor
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public DbSet<User> Users { get; set; }
}
Geçiş eklemeyi deneseydik "EntityType 'User' adlı kullanıcının tanımlı anahtarı yok. Bu EntityType anahtarını tanımlayın." çünkü EF'nin Kullanıcı adı'nın Kullanıcı için birincil anahtar olması gerektiğini bilmesi mümkün değildir.
Şimdi Veri Ek Açıklamaları'nı kullanacağımız için Program.cs dosyasının en üstüne bir using deyimi eklememiz gerekiyor
using System.ComponentModel.DataAnnotations;
Şimdi, birincil anahtar olduğunu belirlemek için Username özelliğine açıklama ekleme
public class User
{
[Key]
public string Username { get; set; }
public string DisplayName { get; set; }
}
Add-Migration AddUser komutunu kullanarak bu değişiklikleri veritabanına uygulamak üzere bir geçişin iskelesini oluşturma
Yeni geçişi veritabanına uygulamak için Update-Database komutunu çalıştırın
Yeni tablo artık veritabanına eklenir:
EF tarafından desteklenen ek açıklamaların tam listesi:
Önceki bölümde, kural tarafından algılananları desteklemek veya geçersiz kılmak için Veri Ek Açıklamalarını kullanmayı inceledik. Modeli yapılandırmanın diğer yolu, Code First fluent API'sini kullanmaktır.
Çoğu model yapılandırması basit veri ek açıklamaları kullanılarak yapılabilir. Akıcı API, veri ek açıklamalarıyla mümkün olmayan bazı gelişmiş yapılandırmalara ek olarak veri ek açıklamalarının gerçekleştirebileceği her şeyi kapsayan model yapılandırmasını belirtmenin daha gelişmiş bir yoludur. Veri ek açıklamaları ve akıcı API birlikte kullanılabilir.
Akıcı API'ye erişmek için DbContext'te OnModelCreating yöntemini geçersiz kılarsınız. User.DisplayName dosyasının depolandığı sütunu display_name olarak yeniden adlandırmak istediğimizi düşünelim.
BloggingContext'te OnModelCreating yöntemini aşağıdaki kodla geçersiz kılın
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.Property(u => u.DisplayName)
.HasColumnName("display_name");
}
}
Bu değişiklikleri veritabanına uygulamak üzere geçişin iskelesini oluşturmak için Add-Migration ChangeDisplayName komutunu kullanın.
Yeni geçişi veritabanına uygulamak için Update-Database komutunu çalıştırın.
DisplayName sütunu artık display_name olarak yeniden adlandırıldı:
Özet
Bu kılavuzda yeni bir veritabanı kullanarak Code First geliştirmesini inceledik. Sınıfları kullanarak bir model tanımladık, ardından bu modeli kullanarak veritabanı oluşturduk ve verileri depolayıp aldık. Veritabanı oluşturulduktan sonra, modelimiz geliştikçe şemayı değiştirmek için Code First Migrations'ı kullandık. Ayrıca Veri Ek Açıklamaları ve Fluent API'sini kullanarak bir modeli yapılandırmayı da gördük.
GitHub'da bizimle işbirliği yapın
Bu içeriğin kaynağı GitHub'da bulunabilir; burada ayrıca sorunları ve çekme isteklerini oluşturup gözden geçirebilirsiniz. Daha fazla bilgi için katkıda bulunan kılavuzumuzu inceleyin.
.NET geri bildirimi
.NET, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin: