Aracılığıyla paylaş


Yeni Veritabanına İlk Kod

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.

Sunan: Rowan Miller

Video: WMV | MP4 | WMV (ZIP)

Önkoşullar

Bu kılavuzu tamamlamak için en az Visual Studio 2010 veya Visual Studio 2012 yüklü olmalıdır.

Visual Studio 2010 kullanıyorsanız NuGet'in de yüklü olması gerekir.

1. Uygulamayı Oluşturma

İş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.

  • Proje –> NuGet Paketlerini Yönet... Not: NuGet Paketlerini Yönet... seçeneğiniz yoksa NuGet'in en son sürümünü yüklemeniz gerekir
  • Çevrimiçi sekmesini seçin
  • EntityFramework paketini seçin
  • Yükle'ye tıklayın

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

    Select Data Source

  • Hangisini yüklediğinize bağlı olarak LocalDB veya SQL Express'e Bağlan

Artık Code First tarafından oluşturulan şemayı inceleyebiliriz.

Schema Initial

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.

  • Araçlar -> Kitaplık Paket Yöneticisi -> Paket Yöneticisi Konsolu

  • Paket Yöneticisi Konsolunda Enable-Migrations komutunu çalıştırın

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

Schema With Url

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:

Schema With Users

EF tarafından desteklenen ek açıklamaların tam listesi:

7. Fluent API

Ö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ı:

Schema With Display Name Renamed

Ö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.