2. Bölüm: etki alanı modellerini oluşturmaPart 2: Creating the Domain Models

, Mike te sonby Mike Wasson

Tamamlanmış projeyi indirDownload Completed Project

Model EkleAdd Models

Entity Framework yaklaşımın üç yolu vardır:There are three ways to approach Entity Framework:

  • Veritabanı-ilk: bir veritabanı ile başlar ve Entity Framework kodu oluşturur.Database-first: You start with a database, and Entity Framework generates the code.
  • Model-önce: bir görsel modelle başlar ve Entity Framework hem veritabanını hem de kodu oluşturur.Model-first: You start with a visual model, and Entity Framework generates both the database and code.
  • Kod-önce: kodla başlar ve veritabanını Entity Framework oluşturur.Code-first: You start with code, and Entity Framework generates the database.

İlk kod yaklaşımı kullanıyoruz, bu nedenle etki alanı nesnelerimizi POCOs (düz-eski CLR nesneleri) olarak tanımlayarak başladık.We are using the code-first approach, so we start by defining our domain objects as POCOs (plain-old CLR objects). Kod-ilk yaklaşımla, etki alanı nesneleri, işlemler veya kalıcılık gibi veritabanı katmanını desteklemek için ek kod gerektirmez.With the code-first approach, domain objects don't need any extra code to support the database layer, such as transactions or persistence. (Özellikle, EntityObject sınıfından devralması gerekmez.) Entity Framework veritabanı şemasını nasıl oluşturduğunu denetlemek için veri açıklamalarını kullanmaya devam edebilirsiniz.(Specifically, they do not need to inherit from the EntityObject class.) You can still use data annotations to control how Entity Framework creates the database schema.

POCOs, veritabanı durumunutanımlayan ek özellikler taşımadığından, kolayca JSON veya XML olarak serileştirilir.Because POCOs do not carry any extra properties that describe database state, they can easily be serialized to JSON or XML. Bununla birlikte, öğreticide daha sonra göreceğiniz gibi Entity Framework modellerinizi her zaman doğrudan istemcilere sunmalısınız.However, that does not mean you should always expose your Entity Framework models directly to clients, as we'll see later in the tutorial.

Aşağıdaki POCOs 'ları oluşturacağız:We will create the following POCOs:

  • ÜrünProduct
  • Sipariş vermeOrder
  • OrderDetailOrderDetail

Her bir sınıfı oluşturmak için Çözüm Gezgini modeller klasörüne sağ tıklayın.To create each class, right-click the Models folder in Solution Explorer. Bağlam menüsünden Ekle ' yi ve ardından sınıf ' ı seçin .From the context menu, select Add and then select Class.

Aşağıdaki uygulamayla bir Product sınıfı ekleyin:Add a Product class with the following implementation:

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 Id özelliğini birincil anahtar olarak kullanır ve veritabanını veritabanı tablosundaki bir kimlik sütunuyla eşler.By convention, Entity Framework uses the Id property as the primary key and maps it to an identity column in the database table. Yeni bir Product örneği oluşturduğunuzda, veritabanı değeri oluşturduğundan Idiçin bir değer ayarlayamazsınız.When you create a new Product instance, you won't set a value for Id, because the database generates the value.

ScaffoldColumn özniteliği, ASP.NET MVC 'nin bir düzenleyici formu oluştururken Id özelliğini atlamasını söyler.The ScaffoldColumn attribute tells ASP.NET MVC to skip the Id property when generating an editor form. Gerekli öznitelik, modeli doğrulamak için kullanılır.The Required attribute is used to validate the model. Name özelliğinin boş olmayan bir dize olması gerektiğini belirtir.It specifies that the Name property must be a non-empty string.

Order sınıfını ekleyin:Add the Order class:

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; }
    }
}

OrderDetail sınıfını ekleyin:Add the OrderDetail class:

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 IlişkileriForeign Key Relations

Bir sipariş birçok sipariş ayrıntısı içerir ve her sipariş ayrıntısı tek bir ürüne başvurur.An order contains many order details, and each order detail refers to a single product. Bu ilişkileri göstermek için OrderDetail sınıfı OrderId ve ProductIdadlı özellikleri tanımlar.To represent these relations, the OrderDetail class defines properties named OrderId and ProductId. Entity Framework, bu özelliklerin yabancı anahtarları temsil ettiğini ve veritabanına yabancı anahtar kısıtlamaları eklemesini sağlar.Entity Framework will infer that these properties represent foreign keys, and will add foreign-key constraints to the database.

Order ve OrderDetail sınıfları, ilişkili nesnelere başvurular içeren "gezinti" özelliklerini de içerir.The Order and OrderDetail classes also include "navigation" properties, which contain references to the related objects. Sipariş verildiğinde, gezinti özelliklerini izleyerek sırayla ürünlere gidebilirsiniz.Given an order, you can navigate to the products in the order by following the navigation properties.

Projeyi şimdi derle.Compile the project now. Entity Framework, modellerin özelliklerini saptamak için yansıma kullanır, bu nedenle veritabanı şemasını oluşturmak için derlenmiş bir bütünleştirilmiş kod gerektirir.Entity Framework uses reflection to discover the properties of the models, so it requires a compiled assembly to create the database schema.

Medya türü Formatlayıcıları yapılandırmaConfigure the Media-Type Formatters

Medya türü biçimlendirici , Web API 'si http yanıt gövdesini yazdığında verilerinizi seri hale getirilen bir nesnedir.A media-type formatter is an object that serializes your data when Web API writes the HTTP response body. Yerleşik Biçimlendiriciler JSON ve XML çıkışını destekler.The built-in formatters support JSON and XML output. Varsayılan olarak, bu formatlayıcılara her ikisi de değere göre tüm nesneleri serileştirilir.By default, both of these formatters serialize all objects by value.

Değere göre serileştirme, bir nesne grafiğinde döngüsel başvurular varsa bir sorun oluşturur.Serialization by value creates a problem if an object graph contains circular references. Bu, Order ve OrderDetail sınıflarıyla tam olarak yapılır çünkü her biri birbirlerine bir başvuru içerir.That's exactly the case with the Order and OrderDetail classes, because each holds a reference to the other. Biçimlendirici başvuruları izler, her bir nesneyi değere göre yazıyor ve daireler içinde yer alır.The formatter will follow the references, writing each object by value, and go in circles. Bu nedenle, varsayılan davranışı değiştirmemiz gerekiyor.Therefore, we need to change the default behavior.

Çözüm Gezgini ' de, uygulama_Başlat klasörünü genişletin ve WebApiConfig.cs adlı dosyayı açın.In Solution Explorer, expand the App_Start folder and open the file named WebApiConfig.cs. WebApiConfig sınıfına aşağıdaki kodu ekleyin:Add the following code to the WebApiConfig class:

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, nesne başvurularını korumak için JSON biçimlendirici olarak ayarlar ve XML biçimlendirici 'yi işlem hattından tamamen kaldırır.This code sets the JSON formatter to preserve object references, and removes the XML formatter from the pipeline entirely. (XML biçimlendirici nesne başvurularını korumak için yapılandırabilirsiniz, ancak bu çok daha fazla çalışmalardır ve bu uygulama için yalnızca JSON gereklidir.(You can configure the XML formatter to preserve object references, but it's a little more work, and we only need JSON for this application. Daha fazla bilgi için bkz. Döngüsel nesne başvurularını işleme.)For more information, see Handling Circular Object References.)