Veri Erişim Katmanını Oluşturma

by Erik Reitan

Wingtip Toys örnek projesini indirin (C#) veya indirme E-kitabı (PDF)

Bu öğretici serisi, ASP.NET 4,5 ve Web için Microsoft Visual Studio Express 2013 kullanarak bir ASP.NET Web Forms uygulaması oluşturma hakkında temel bilgileri öğretir. Kaynak koduna sahip C# Visual Studio 2013 bir proje, bu öğretici serisine eşlik etmek için kullanılabilir.

Bu öğreticide, ASP.NET Web Forms ve Code First Entity Framework kullanarak bir veritabanında veri oluşturma, erişme ve gözden geçirme açıklanmaktadır. Bu öğretici, önceki öğreticide "Projeyi oluşturma" ve Wingtip oyuncak mağaza öğreticisi serisinin bir parçası olarak oluşturulur. Bu öğreticiyi tamamladığınızda, projenin modeller klasöründe olan bir veri erişim sınıfları grubu oluşturacaksınız.

Öğrenecekleriniz:

  • Veri modellerini oluşturma.
  • Veritabanını başlatma ve çekirdek oluşturma.
  • Veritabanını desteklemek için uygulamayı güncelleştirme ve yapılandırma.

Öğreticide sunulan özellikler şunlardır:

  • Entity Framework Code First
  • Yerel veritabanı
  • Veri Açıklamaları

Veri modellerini oluşturma

Entity Framework , nesne ilişkisel eşleme (ORM) çerçevesidir. Genellikle yazmanız gereken veri erişimi kodunun çoğunu ortadan kaldırarak, ilişkisel verilerle nesne olarak çalışmanıza olanak sağlar. Entity Framework kullanarak, LINQkullanarak sorgular verebilir, ardından verileri kesin olarak belirlenmiş nesneler olarak alabilir ve işleyebilirsiniz. LINQ, verileri sorgulamak ve güncelleştirmek için desenler sağlar. Entity Framework kullanmak, veri erişim temelleri üzerine odaklanmak yerine uygulamanızın geri kalanını oluşturmaya odaklanabilmenizi sağlar. Bu öğretici serisinde daha sonra, verileri nasıl kullanacağınızı, gezinti ve ürün sorgularını doldurmak için göstereceğiz.

Entity Framework, Code Firstadlı bir geliştirme paradigmasını destekler. Code First, sınıfları kullanarak veri modellerinizi tanımlamanıza olanak sağlar. Sınıf, diğer türlerin, yöntemlerin ve olayların değişkenlerini birlikte gruplandırarak kendi özel türlerinizi oluşturmanızı sağlayan bir yapıdır. Sınıfları varolan bir veritabanıyla eşleyebilir veya bir veritabanı oluşturmak için kullanabilirsiniz. Bu öğreticide, veri modeli sınıfları yazarak veri modellerini oluşturacaksınız. Daha sonra, bu yeni sınıflardan anında veritabanını Entity Framework oluşturmaya izin vereceksiniz.

Web Forms uygulaması için veri modellerini tanımlayan varlık sınıfları oluşturarak başlarsınız. Daha sonra varlık sınıflarını yöneten ve veritabanına veri erişimi sağlayan bir bağlam sınıfı oluşturacaksınız. Ayrıca, veritabanını doldurmak için kullanacağınız bir başlatıcı sınıfı oluşturacaksınız.

Entity Framework ve başvurular

Varsayılan olarak, Web Forms şablonunu kullanarak yeni bir ASP.NET Web uygulaması oluşturduğunuzda Entity Framework dahil edilir. Entity Framework, bir NuGet paketi olarak yüklenebilir, kaldırılabilir ve güncelleştirilebilen olabilir.

Bu NuGet paketi, projenizde aşağıdaki çalışma zamanı derlemelerini içerir:

  • EntityFramework. dll – Entity Framework tarafından kullanılan tüm ortak çalışma zamanı kodları
  • EntityFramework. SqlServer. dll – Entity Framework için Microsoft SQL Server sağlayıcısı

Varlık sınıfları

Verilerin şemasını tanımlamak için oluşturduğunuz sınıflar varlık sınıfları olarak adlandırılır. Veritabanı tasarımına yeni başladıysanız varlık sınıflarını bir veritabanının tablo tanımları olarak düşünün. Sınıftaki her bir özellik, veritabanının tablosundaki bir sütunu belirtir. Bu sınıflar, nesne odaklı kod ve veritabanının ilişkisel tablo yapısı arasında basit, nesne ilişkisel bir arabirim sağlar.

Bu öğreticide, ürünler ve kategoriler için şemaları temsil eden basit varlık sınıfları ekleyerek başlayacaksınız. Products sınıfı her ürün için tanımlar içerir. Ürün sınıfının her üyesinin adı ProductID, ProductName, Description, ImagePath, UnitPrice, CategoryIDve Categoryolacaktır. Kategori sınıfı, bir ürünün ait olduğu her bir kategorinin, otomobil, bot veya düzlem gibi tanımlar içerir. Kategori sınıfının her üyesinin adı CategoryID, CategoryName, Descriptionve Productsolacaktır. Her ürün kategorilerden birine ait olacaktır. Bu varlık sınıfları projenin mevcut modeller klasörüne eklenecektir.

  1. Çözüm Gezgini, modeller klasörüne sağ tıklayın ve ardından Yeni öğe> -Ekle ' yi seçin.

    Veri erişim katmanını oluşturma-yeni öğe menüsü

    Yeni öğe Ekle iletişim kutusu görüntülenir.

  2. Soldaki yüklü bölmeden görsel C# ' ün altında kod' u seçin.

    Veri erişim katmanını oluşturma-yeni öğe menüsü

  3. Orta bölmeden sınıf ' ı seçin ve bu yeni sınıfı Product.csolarak adlandırın.

  4. Ekle'yi tıklatın.
    Yeni sınıf dosyası düzenleyicide görüntülenir.

  5. Varsayılan kodu şu kodla değiştirin:

    using System.ComponentModel.DataAnnotations;
    
    namespace WingtipToys.Models
    {
        public class Product
        {
            [ScaffoldColumn(false)]
            public int ProductID { get; set; }
    
            [Required, StringLength(100), Display(Name = "Name")]
            public string ProductName { get; set; }
    
            [Required, StringLength(10000), Display(Name = "Product Description"), DataType(DataType.MultilineText)]
            public string Description { get; set; }
    
            public string ImagePath { get; set; }
    
            [Display(Name = "Price")]
            public double? UnitPrice { get; set; }
    
            public int? CategoryID { get; set; }
    
            public virtual Category Category { get; set; }
        }
    }
    
  6. 1 ile 4 arasındaki adımları tekrarlayarak başka bir sınıf oluşturun, yeni sınıfı category.cs olarak adlandırın ve varsayılan kodu şu kodla değiştirin:

    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    namespace WingtipToys.Models
    {
        public class Category
        {
            [ScaffoldColumn(false)]
            public int CategoryID { get; set; }
    
            [Required, StringLength(100), Display(Name = "Name")]
            public string CategoryName { get; set; }
    
            [Display(Name = "Product Description")]
            public string Description { get; set; }
    
            public virtual ICollection<Product> Products { get; set; }
        }
    }
    

Daha önce belirtildiği gibi, Category sınıfı uygulamanın satış için tasarlandığı ürün türünü temsil eder ( "otomobiller", "Boats", "Rockets"vb.) ve Product sınıfı veritabanındaki bireysel ürünleri (Toys) temsil eder. Bir Product nesnesinin her örneği, ilişkisel veritabanı tablosundaki bir satıra karşılık gelir ve ürün sınıfının her özelliği ilişkisel veritabanı tablosundaki bir sütunla eşlenir. Bu öğreticide daha sonra veritabanında bulunan ürün verilerini gözden geçireceğiz.

Veri Açıklamaları

Sınıfların belirli üyelerinin, [ScaffoldColumn(false)]gibi, üyeyle ilgili ayrıntıları belirten özniteliklere sahip olduğunu fark etmiş olabilirsiniz. Bunlar veri ek açıklamalardır. Veri ek açıklaması öznitelikleri, bu üye için Kullanıcı girişinin nasıl doğrulandığını tanımlayabilir, bu üyeye yönelik biçimlendirmeyi belirtebilir ve veritabanı oluşturulduğunda nasıl modellendirildiğini belirtebilir.

Bağlam Sınıfı

Veri erişimi için sınıfları kullanmaya başlamak için bir bağlam sınıfı tanımlamanız gerekir. Daha önce belirtildiği gibi, bağlam sınıfı varlık sınıflarını (Product sınıfı ve Category sınıfı) yönetir ve veritabanına veri erişimi sağlar.

Bu yordam modeller klasörüne yeni C# bir bağlam sınıfı ekler .

  1. Modeller klasörüne sağ tıklayın ve ardından yeni öğe> -Ekle ' yi seçin.
    Yeni öğe Ekle iletişim kutusu görüntülenir.

  2. Orta bölmeden sınıf ' ı seçin, ProductContext.cs olarak adlandırın ve Ekle' ye tıklayın.

  3. Sınıfında bulunan varsayılan kodu aşağıdaki kodla değiştirin:

    using System.Data.Entity;
    namespace WingtipToys.Models
    {
        public class ProductContext : DbContext
        {
            public ProductContext() : base("WingtipToys")
            {
            }
            public DbSet<Category> Categories { get; set; }
            public DbSet<Product> Products { get; set; }
        }
    }
    

Bu kod, kesin olarak belirlenmiş nesnelerle çalışarak verileri sorgulama, ekleme, güncelleştirme ve silme özelliğini içeren Entity Framework tüm çekirdek işlevlerine erişebilmeniz için System.Data.Entity ad alanını ekler.

ProductContext sınıfı, veritabanında Product sınıf örneklerinin getirmeyi, depolanmasını ve güncelleştirilmesini işleyen Entity Framework ürün veritabanı bağlamını temsil eder. ProductContext sınıfı Entity Framework tarafından sunulan DbContext taban sınıftan türetilir.

Başlatıcı sınıfı

Bağlam ilk kez kullanıldığında veritabanını başlatmak için bazı özel mantık çalıştırmanız gerekir. Bu, ürünleri ve kategorileri hemen görüntüleyebilmeniz için çekirdek verilerin veritabanına eklenmesine izin verir.

Bu yordam modeller klasörüne yeni C# bir başlatıcı sınıfı ekler .

  1. Modeller klasöründe başka bir Class oluşturun ve ProductDatabaseInitializer.csolarak adlandırın.

  2. Sınıfında bulunan varsayılan kodu aşağıdaki kodla değiştirin:

    using System.Collections.Generic;
    using System.Data.Entity;
    
    namespace WingtipToys.Models
    {
      public class ProductDatabaseInitializer : DropCreateDatabaseIfModelChanges<ProductContext>
      {
        protected override void Seed(ProductContext context)
        {
          GetCategories().ForEach(c => context.Categories.Add(c));
          GetProducts().ForEach(p => context.Products.Add(p));
        }
    
        private static List<Category> GetCategories()
        {
          var categories = new List<Category> {
                    new Category
                    {
                        CategoryID = 1,
                        CategoryName = "Cars"
                    },
                    new Category
                    {
                        CategoryID = 2,
                        CategoryName = "Planes"
                    },
                    new Category
                    {
                        CategoryID = 3,
                        CategoryName = "Trucks"
                    },
                    new Category
                    {
                        CategoryID = 4,
                        CategoryName = "Boats"
                    },
                    new Category
                    {
                        CategoryID = 5,
                        CategoryName = "Rockets"
                    },
                };
    
          return categories;
        }
    
        private static List<Product> GetProducts()
        {
          var products = new List<Product> {
                    new Product
                    {
                        ProductID = 1,
                        ProductName = "Convertible Car",
                        Description = "This convertible car is fast! The engine is powered by a neutrino based battery (not included)." + 
                                      "Power it up and let it go!", 
                        ImagePath="carconvert.png",
                        UnitPrice = 22.50,
                        CategoryID = 1
                   },
                    new Product 
                    {
                        ProductID = 2,
                        ProductName = "Old-time Car",
                        Description = "There's nothing old about this toy car, except it's looks. Compatible with other old toy cars.",
                        ImagePath="carearly.png",
                        UnitPrice = 15.95,
                         CategoryID = 1
                   },
                    new Product
                    {
                        ProductID = 3,
                        ProductName = "Fast Car",
                        Description = "Yes this car is fast, but it also floats in water.",
                        ImagePath="carfast.png",
                        UnitPrice = 32.99,
                        CategoryID = 1
                    },
                    new Product
                    {
                        ProductID = 4,
                        ProductName = "Super Fast Car",
                        Description = "Use this super fast car to entertain guests. Lights and doors work!",
                        ImagePath="carfaster.png",
                        UnitPrice = 8.95,
                        CategoryID = 1
                    },
                    new Product
                    {
                        ProductID = 5,
                        ProductName = "Old Style Racer",
                        Description = "This old style racer can fly (with user assistance). Gravity controls flight duration." + 
                                      "No batteries required.",
                        ImagePath="carracer.png",
                        UnitPrice = 34.95,
                        CategoryID = 1
                    },
                    new Product
                    {
                        ProductID = 6,
                        ProductName = "Ace Plane",
                        Description = "Authentic airplane toy. Features realistic color and details.",
                        ImagePath="planeace.png",
                        UnitPrice = 95.00,
                        CategoryID = 2
                    },
                    new Product
                    {
                        ProductID = 7,
                        ProductName = "Glider",
                        Description = "This fun glider is made from real balsa wood. Some assembly required.",
                        ImagePath="planeglider.png",
                        UnitPrice = 4.95,
                        CategoryID = 2
                    },
                    new Product
                    {
                        ProductID = 8,
                        ProductName = "Paper Plane",
                        Description = "This paper plane is like no other paper plane. Some folding required.",
                        ImagePath="planepaper.png",
                        UnitPrice = 2.95,
                        CategoryID = 2
                    },
                    new Product
                    {
                        ProductID = 9,
                        ProductName = "Propeller Plane",
                        Description = "Rubber band powered plane features two wheels.",
                        ImagePath="planeprop.png",
                        UnitPrice = 32.95,
                        CategoryID = 2
                    },
                    new Product
                    {
                        ProductID = 10,
                        ProductName = "Early Truck",
                        Description = "This toy truck has a real gas powered engine. Requires regular tune ups.",
                        ImagePath="truckearly.png",
                        UnitPrice = 15.00,
                        CategoryID = 3
                    },
                    new Product
                    {
                        ProductID = 11,
                        ProductName = "Fire Truck",
                        Description = "You will have endless fun with this one quarter sized fire truck.",
                        ImagePath="truckfire.png",
                        UnitPrice = 26.00,
                        CategoryID = 3
                    },
                    new Product
                    {
                        ProductID = 12,
                        ProductName = "Big Truck",
                        Description = "This fun toy truck can be used to tow other trucks that are not as big.",
                        ImagePath="truckbig.png",
                        UnitPrice = 29.00,
                        CategoryID = 3
                    },
                    new Product
                    {
                        ProductID = 13,
                        ProductName = "Big Ship",
                        Description = "Is it a boat or a ship. Let this floating vehicle decide by using its " + 
                                      "artifically intelligent computer brain!",
                        ImagePath="boatbig.png",
                        UnitPrice = 95.00,
                        CategoryID = 4
                    },
                    new Product
                    {
                        ProductID = 14,
                        ProductName = "Paper Boat",
                        Description = "Floating fun for all! This toy boat can be assembled in seconds. Floats for minutes!" + 
                                      "Some folding required.",
                        ImagePath="boatpaper.png",
                        UnitPrice = 4.95,
                        CategoryID = 4
                    },
                    new Product
                    {
                        ProductID = 15,
                        ProductName = "Sail Boat",
                        Description = "Put this fun toy sail boat in the water and let it go!",
                        ImagePath="boatsail.png",
                        UnitPrice = 42.95,
                        CategoryID = 4
                    },
                    new Product
                    {
                        ProductID = 16,
                        ProductName = "Rocket",
                        Description = "This fun rocket will travel up to a height of 200 feet.",
                        ImagePath="rocket.png",
                        UnitPrice = 122.95,
                        CategoryID = 5
                    }
                };
    
          return products;
        }
      }
    }
    

Yukarıdaki koddan görebileceğiniz gibi, veritabanı oluşturulup başlatıldığında Seed özelliği geçersiz kılınır ve ayarlanır. Seed özelliği ayarlandığında, Kategoriler ve ürünlerdeki değerler veritabanını doldurmak için kullanılır. Veritabanı oluşturulduktan sonra yukarıdaki kodu değiştirerek çekirdek verileri güncelleştirmeye çalışırsanız, Web uygulamasını çalıştırdığınızda hiçbir güncelleştirme görmezsiniz. Bu nedenle, yukarıdaki kod, çekirdek verileri sıfırlamadan önce modelin (şema) değişip değişmediğini tanımak için DropCreateDatabaseIfModelChanges sınıfının bir uygulamasını kullanır. Category ve Product varlık sınıflarında hiçbir değişiklik yapılmadığından, veritabanı çekirdek verilerle yeniden başlatılır.

Note

Uygulamayı her çalıştırışınızda veritabanının yeniden oluşturulmasını istediyseniz, DropCreateDatabaseIfModelChanges sınıfı yerine DropCreateDatabaseAlways sınıfını kullanabilirsiniz. Bununla birlikte, bu öğretici serisi için DropCreateDatabaseIfModelChanges sınıfını kullanın.

Bu öğreticide, dört yeni sınıfa ve bir varsayılan sınıfa sahip bir modeller klasörünüze sahip olursunuz:

Veri erişim katmanı-modeller klasörünü oluşturma

Uygulamayı veri modelini kullanacak şekilde yapılandırma

Artık verileri temsil eden sınıfları oluşturduğunuza göre, uygulamayı sınıfları kullanacak şekilde yapılandırmanız gerekir. Global. asax dosyasında, modeli başlatan kodu eklersiniz. Web. config dosyasında, uygulamanın yeni veri sınıfları tarafından temsil edilen verileri depolamak için hangi veritabanına kullanacağınızı belirten bilgileri eklersiniz. Global. asax dosyası, uygulama olaylarını veya yöntemlerini işlemek için kullanılabilir. Web. config dosyası, ASP.NET Web uygulamanızın yapılandırmasını denetlemenize olanak tanır.

Global. asax dosyası güncelleştiriliyor

Uygulama başlatıldığında veri modellerini başlatmak için, Global.asax.cs dosyasında Application_Start işleyicisini güncelleşolursunuz.

Note

Çözüm Gezgini, Global.asax.cs dosyasını düzenlemek için Global. asax dosyasını veya Global.asax.cs dosyasını seçebilirsiniz.

  1. Global.asax.cs dosyasındaki Application_Start yöntemine sarıya vurgulanan aşağıdaki kodu ekleyin.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Optimization;
    using System.Web.Routing;
    using System.Web.Security;
    using System.Web.SessionState;
    using System.Data.Entity;
    using WingtipToys.Models;
    
    namespace WingtipToys
    {
        public class Global : HttpApplication
        {
            void Application_Start(object sender, EventArgs e)
            {
                // Code that runs on application startup
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
    
                // Initialize the product database.
                Database.SetInitializer(new ProductDatabaseInitializer());
            }
        }
    }
    

Note

Tarayıcınız, bu öğretici serisini bir tarayıcıda görüntülerken sarı renkle vurgulanmış kodu görüntülemek için HTML5 'yi desteklemelidir.

Yukarıdaki kodda gösterildiği gibi, uygulama başladığında, uygulama ilk kez veriye erişildiğinde çalıştırılacak başlatıcıyı belirtir. Database nesnesine ve ProductDatabaseInitializer nesnesine erişmek için iki ek ad alanı gerekir.

Web. config dosyasını değiştirme

Entity Framework Code First veritabanı çekirdek verilerle doldurulduğu zaman varsayılan bir konumda sizin için bir veritabanı oluşturacak olsa da, uygulamanıza kendi bağlantı bilgilerinizi eklemek, veritabanı konumunu denetlemenizi sağlar. Bu veritabanı bağlantısını, projenin kökündeki uygulamanın Web. config dosyasında bir bağlantı dizesi kullanarak belirtirsiniz. Yeni bir bağlantı dizesi ekleyerek veritabanının konumunu (wingtiptoys. mdf) varsayılan konumu yerine uygulamanın veri dizininde (App_verileri) oluşturulacak şekilde yönlendirebilirsiniz. Bu değişikliğin yapılması, bu öğreticide daha sonra veritabanı dosyasını bulmanıza ve incelemenize olanak sağlayacak.

  1. Çözüm Gezgini, Web. config dosyasını bulun ve açın.

  2. Sarı olarak vurgulanan bağlantı dizesini Web. config dosyasının <connectionStrings> bölümüne aşağıdaki gibi ekleyin:

    <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WingtipToys-20131119102907.mdf;Initial Catalog=aspnet-WingtipToys-20131119102907;Integrated Security=True"
    providerName="System.Data.SqlClient" />
    <add name="WingtipToys"
    connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\wingtiptoys.mdf;Integrated Security=True"
    providerName="System.Data.SqlClient" />
    </connectionStrings>
    

Uygulama ilk kez çalıştırıldığında, veritabanı bağlantı dizesi tarafından belirtilen konumda oluşturulur. Ancak uygulamayı çalıştırmadan önce, önce oluşturalım.

Uygulama Oluşturma

Web uygulamanızdaki tüm sınıfların ve değişikliklerin çalıştığından emin olmak için uygulamayı derlemeniz gerekir.

  1. Hata Ayıkla menüsünde, Build wingtiptoys' u seçin.
    Çıkış penceresi görüntülenir ve hepsi de varsa, başarılı bir ileti görürsünüz.

    Veri erişim katmanı çıkış pencerelerini oluşturma

Bir hata halinde çalıştırırsanız yukarıdaki adımları yeniden denetleyin. Çıkış penceresindeki bilgiler, hangi dosyanın bir sorun olduğunu ve dosyada bir değişikliğin gerekli olduğunu gösterir. Bu bilgiler, yukarıdaki adımların projenizde neleri gözden geçirilmesi ve düzeltilmesi gerektiğini belirlemenizi sağlar.

Özet

Serinin Bu öğreticide, veri modeli oluşturdunuz ve ayrıca veritabanını başlatmak ve temel almak için kullanılacak kodu eklediniz. Uygulamayı, uygulama çalıştırıldığında veri modellerini kullanmak için de yapılandırdınız.

Sonraki öğreticide, Kullanıcı arabirimini güncelleştireceğiz, gezinti ekleyecek ve veritabanından veri alacaksınız. Bu, veritabanının bu öğreticide oluşturduğunuz varlık sınıflarına göre otomatik olarak oluşturulmasını sağlayacaktır.

Ek Kaynaklar

Entity Framework genel bakış
Başlangıç Kılavuzu, ADO.NET Entity Framework
Entity Framework Ile geliştirme Code First (video)
Code First Ilişkiler AKıCı apı
Code First veri açıklamaları
Entity Framework için üretkenlik Iyileştirmeleri