Bölüm 2: Etki Alanı Modellerini Oluşturma
tarafından Rick Anderson
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.
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 Id
değ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 ProductId
adlı OrderId
özellikleri tanımlar. Entity Framework, bu özelliklerin yabancı anahtarları temsil ettiğini çıkarsar ve veritabanına yabancı anahtar kısıtlamaları ekler.
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.)