Bagikan melalui


Bagian 2: Membuat Model Domain

oleh Rick Anderson

Unduh Proyek yang Selesai

Tambahkan Model

Ada tiga cara untuk mendekati Entity Framework:

  • Database-first: Anda mulai dengan database, dan Entity Framework menghasilkan kode.
  • Model-first: Anda mulai dengan model visual, dan Entity Framework menghasilkan database dan kode.
  • Code-first: Anda mulai dengan kode, dan Entity Framework menghasilkan database.

Kami menggunakan pendekatan code-first, jadi kami mulai dengan mendefinisikan objek domain kami sebagai POCO (objek CLR biasa). Dengan pendekatan code-first, objek domain tidak memerlukan kode tambahan apa pun untuk mendukung lapisan database, seperti transaksi atau persistensi. (Secara khusus, mereka tidak perlu mewarisi dari kelas EntityObject .) Anda masih dapat menggunakan anotasi data untuk mengontrol cara Kerangka Kerja Entitas membuat skema database.

Karena POCO tidak membawa properti tambahan apa pun yang menjelaskan status database, MEREKA dapat dengan mudah diserialisasikan ke JSON atau XML. Namun, itu tidak berarti Anda harus selalu mengekspos model Kerangka Kerja Entitas Anda langsung ke klien, seperti yang akan kita lihat nanti dalam tutorial.

Kami akan membuat POCO berikut:

  • Produk
  • Pesanan
  • OrderDetail

Untuk membuat setiap kelas, klik kanan folder Model di Penjelajah Solusi. Dari menu konteks, pilih Tambahkan lalu pilih Kelas.

Cuplikan layar menu Penjelajah Solusi untuk folder Model. Menu Tambahkan terbuka dan opsi Kelas disorot.

Product Tambahkan kelas dengan implementasi berikut:

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

Menurut konvensi, Kerangka Kerja Entitas menggunakan Id properti sebagai kunci utama dan memetakannya ke kolom identitas dalam tabel database. Saat membuat instans baru Product , Anda tidak akan menetapkan nilai untuk Id, karena database menghasilkan nilai .

Atribut ScaffoldColumn memberi tahu ASP.NET MVC untuk melewati Id properti saat membuat formulir editor. Atribut Wajib digunakan untuk memvalidasi model. Ini menentukan bahwa Name properti harus berupa string yang tidak kosong.

Order Tambahkan kelas :

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 Tambahkan kelas :

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

Hubungan Kunci Asing

Pesanan berisi banyak detail pesanan, dan setiap detail pesanan mengacu pada satu produk. Untuk mewakili hubungan ini, OrderDetail kelas menentukan properti bernama OrderId dan ProductId. Entity Framework akan menyimpulkan bahwa properti ini mewakili kunci asing, dan akan menambahkan batasan kunci asing ke database.

Cuplikan layar menu Visual Studio untuk kelas Pesanan, Produk, dan OrderDetails.

Kelas Order dan OrderDetail juga mencakup properti "navigasi", yang berisi referensi ke objek terkait. Dengan pesanan, Anda dapat menavigasi ke produk dalam urutan dengan mengikuti properti navigasi.

Kompilasi proyek sekarang. Entity Framework menggunakan refleksi untuk menemukan properti model, sehingga memerlukan rakitan yang dikompilasi untuk membuat skema database.

Mengonfigurasi Media-Type Formatters

Formatter jenis media adalah objek yang menserialisasikan data Anda saat Web API menulis isi respons HTTP. Formatter bawaan mendukung output JSON dan XML. Secara default, kedua pemformat ini menserialisasikan semua objek menurut nilai.

Serialisasi menurut nilai membuat masalah jika grafik objek berisi referensi melingkar. Itu persis terjadi dengan Order kelas dan OrderDetail , karena masing-masing memegang referensi ke yang lain. Pemformat akan mengikuti referensi, menulis setiap objek menurut nilai, dan masuk dalam lingkaran. Oleh karena itu, kita perlu mengubah perilaku default.

Di Penjelajah Solusi, perluas folder App_Start dan buka file bernama WebApiConfig.cs. Tambahkan kode berikut ke kelas WebApiConfig:

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

Kode ini mengatur formatter JSON untuk mempertahankan referensi objek, dan menghapus formatter XML dari alur sepenuhnya. (Anda dapat mengonfigurasi formatter XML untuk mempertahankan referensi objek, tetapi sedikit lebih banyak pekerjaan, dan kita hanya perlu JSON untuk aplikasi ini. Untuk informasi selengkapnya, lihat Menangani Referensi Objek Melingkar.)