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:

  • Veritabanı öncelikli: 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şlayacağız. 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, JSON veya XML olarak kolayca seri hale getirilebilir. Ancak bu, öğreticinin ilerleyen bölümlerinde 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ş
  • Orderdetail

Her sınıfı oluşturmak için, Çözüm Gezgini'da Models 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 uygulamaya sahip 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ütunuyla eşler. Yeni Product bir örnek oluşturduğunuzda, değeri veritabanı oluşturduğundan için Iddeğerini ayarlamazsınız.

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

Sınıfını Order 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ını 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; }
    }
}

Dış Anahtar İlişkileri

Bir sipariş birçok sipariş ayrıntısı içerir ve her sipariş ayrıntısı tek bir ürüne karşılık gelir. Bu ilişkileri temsil etmek için sınıfı OrderDetail ve ProductIdadlı OrderId ö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. 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. Her biri diğerine bir başvuru içerdiğinden ve OrderDetail sınıflarının durumu tam olarak Order budur. Biçimlendirici başvuruları izler, her nesneyi değere göre yazar ve daire içine alır. Bu nedenle, varsayılan davranışı değiştirmemiz gerekir.

Çözüm Gezgini'da App_Start klasörünü genişletin ve WebApiConfig.cs adlı dosyayı açın. Sınıfına aşağıdaki kodu WebApiConfig 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 işe yaramaktadır ve bu uygulama için yalnızca JSON'a ihtiyacımız vardır. Daha fazla bilgi için bkz . Döngüsel Nesne Başvurularını İşleme.)