Bölüm 2: Etki Alanı Modellerini Oluşturma

tarafından Rick Anderson

Tamamlanan Projeyi İndir

Model Ekle

Entity Framework'e yaklaşmanın üç yolu vardır:

  • Önce veritabanı: Bir veritabanıyla başlarsınız ve Entity Framework kodu oluşturur.
  • Model öncelikli: Görsel bir modelle başlarsınız ve Entity Framework hem veritabanını hem de kodu oluşturur.
  • Kod öncelikli: Kodla başlarsınız ve Entity Framework veritabanını oluşturur.

Kod öncelikli yaklaşımı kullanıyoruz, bu nedenle etki alanı nesnelerimizi POCO'lar (düz eski CLR nesneleri) olarak tanımlayarak başlıyoruz. Kod öncelikli yaklaşımla, etki alanı nesnelerinin veritabanı katmanını desteklemek için işlemler veya kalıcılık gibi ek kodlara ihtiyacı yoktur. (Özellikle, EntityObject sınıfından devralmaları gerekmez.) Entity Framework'ün veritabanı şemasını nasıl oluşturduğunu denetlemek için veri ek açıklamalarını kullanmaya devam edebilirsiniz.

POCO'lar veritabanı durumunu açıklayan ek özellikler taşımadığından, kolayca JSON veya XML olarak seri hale getirilebilir. Ancak bu, öğreticinin devamında göreceğimiz gibi Entity Framework modellerinizi her zaman doğrudan istemcilere sunmanız gerektiği anlamına gelmez.

Aşağıdaki POCO'ları oluşturacağız:

  • ürün
  • Sipariş
  • Sipariş Detayı

Her sınıfı oluşturmak için Çözüm Gezgini'nde Modeller klasörüne sağ tıklayın. Bağlam menüsünde Ekle'yi ve ardından Sınıf'ı seçin.

Modeller klasörünün Çözüm Gezgini menüsünün ekran görüntüsü. Ekle menüsü açık ve Sınıf seçeneği vurgulanmış.

Aşağıdaki uygulamayla bir Product sınıf ekleyin:

namespace ProductStore.Models
{
    using System.ComponentModel.DataAnnotations;

    public class Product
    {
        [ScaffoldColumn(false)]
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        public decimal Price { get; set; }
        public decimal ActualCost { get; set; }
    }
}

Kural gereği, Entity Framework birincil anahtar olarak özelliğini kullanır Id ve bunu veritabanı tablosundaki bir kimlik sütununa eşler. Yeni bir Product örneği oluşturduğunuzda, değeri veritabanı oluşturacağı için Id'i ayarlamazsınız.

ScaffoldColumn özniteliği, ASP.NET MVC'ye bir düzenleyici form oluştururken bu özelliğin atlanmasını belirtir Id. Gerekli özniteliği modeli doğrulamak için kullanılır. Özelliğin Name boş olmayan bir dize olması gerektiğini belirtir.

Order sınıfını ekleyin.

namespace ProductStore.Models
{
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;

    public class Order
    {
        public int Id { get; set; }
        [Required]
        public string Customer { get; set; }

        // Navigation property
        public  ICollection<OrderDetail> OrderDetails { get; set; }
    }
}

Sınıfı OrderDetail ekleyin:

namespace ProductStore.Models
{
    public class OrderDetail
    {
        public int Id { get; set; }
        public int Quantity { get; set; }
        public int OrderId { get; set; }
        public int ProductId { get; set; }

        // Navigation properties
        public Product Product { get; set; }
        public Order Order { get; set; }
    }
}

Yabancı Anahtar İlişkileri

Bir sipariş birçok sipariş ayrıntısı içerir ve her sipariş ayrıntısı tek bir ürünü ifade eder. Bu ilişkileri temsil etmek için sınıfı OrderDetail ve OrderIdadlı ProductId özellikleri tanımlar. Entity Framework, bu özelliklerin yabancı anahtarları temsil ettiğini çıkarsar ve veritabanına yabancı anahtar kısıtlamaları ekler.

Orders, Products ve OrderDetails sınıfları için Visual Studio menülerinin ekran görüntüsü.

Order ve OrderDetail sınıfları, ilgili nesnelere başvurular içeren "gezinti" özelliklerini de içerir. Bir sipariş verdiğinizde, gezinti özelliklerini izleyerek siparişteki ürünlere gidebilirsiniz.

Projeyi şimdi derleyin. Entity Framework, modellerin özelliklerini bulmak için yansıma kullanır, bu nedenle veritabanı şemasını oluşturmak için derlenmiş bir derleme gerektirir.

Media-Type Biçimlendiricilerini yapılandırma

Medya türü biçimlendirici, Web API'sinin HTTP yanıt gövdesini yazdığında verilerinizi seri hale getiren bir nesnedir. Yerleşik biçimlendiriciler JSON ve XML çıkışını destekler. Varsayılan olarak, bu biçimlendiricilerin her ikisi de tüm nesneleri değere göre serileştirir.

Değere göre seri hale getirme, nesne grafı döngüsel başvurular içeriyorsa bir sorun oluşturur. Bu tam olarak Order ve OrderDetail sınıflarında görülen durumdur, çünkü her biri diğerine bir başvuru taşır. Biçimlendirici başvuruları izler, her nesneyi değer olarak yazar ve döngü yapar. Bu nedenle, varsayılan davranışı değiştirmemiz gerekir.

Çözüm Gezgini'nde App_Start klasörünü genişletin ve WebApiConfig.cs adlı dosyayı açın. WebApiConfig sınıfına aşağıdaki kodu ekleyin:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // New code:
        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling =
            Newtonsoft.Json.PreserveReferencesHandling.Objects;

        config.Formatters.Remove(config.Formatters.XmlFormatter);
    }
}

Bu kod JSON biçimlendiricisini nesne başvurularını koruyacak şekilde ayarlar ve XML biçimlendiricisini işlem hattından tamamen kaldırır. (XML biçimlendiricisini nesne başvurularını koruyacak şekilde yapılandırabilirsiniz, ancak bu biraz daha fazla iştir ve yalnızca bu uygulama için JSON'a ihtiyacımız vardır. Daha fazla bilgi için bkz . Döngüsel Nesne Başvurularını İşleme.)