Bagikan melalui


Bagian 3: Membuat Pengontrol Admin

oleh Rick Anderson

Unduh Proyek yang Selesai

Menambahkan Pengontrol Admin

Di bagian ini, kita akan menambahkan pengontrol API Web yang mendukung operasi CRUD (buat, baca, perbarui, dan hapus) pada produk. Pengontrol akan menggunakan Kerangka Kerja Entitas untuk berkomunikasi dengan lapisan database. Hanya administrator yang dapat menggunakan pengontrol ini. Pelanggan akan mengakses produk melalui pengontrol lain.

Di Penjelajah Solusi, klik kanan folder Pengontrol. Pilih Tambahkan lalu Pengontrol.

Cuplikan layar menu pengontrol Penjelajah Solusi. Opsi tambahkan dipilih dan Pengontrol disorot.

Dalam dialog Tambahkan Pengontrol , beri nama pengontrol AdminController. Di bawah Templat, pilih "Pengontrol API dengan tindakan baca/tulis, menggunakan Kerangka Kerja Entitas". Di bawah Kelas model, pilih "Produk (ProductStore.Models)". Di bawah Konteks Data, pilih "<Konteks> Data Baru".

Cuplikan layar kotak dialog Tambahkan Pengontrol. Menu kelas konteks data terbuka dan konteks data baru disorot.

Catatan

Jika drop-down kelas Model tidak menampilkan kelas model apa pun, pastikan Anda mengkompilasi proyek. Entity Framework menggunakan refleksi, sehingga membutuhkan perakitan yang dikompilasi.

Memilih "<Konteks> Data Baru" akan membuka dialog Konteks Data Baru . Beri nama konteks ProductStore.Models.OrdersContextdata .

Cuplikan layar dialog konteks data baru. Kotak teks memperlihatkan nama konteks data baru yang ditik.

Klik OK untuk menutup dialog Konteks Data Baru . Dalam dialog Tambahkan Pengontrol , klik Tambahkan.

Inilah yang ditambahkan ke proyek:

  • Kelas bernama OrdersContext yang berasal dari DbContext. Kelas ini menyediakan lem antara model POCO dan database.
  • Pengontrol API Web bernama AdminController. Pengontrol ini mendukung operasi CRUD pada Product instans. Ini menggunakan OrdersContext kelas untuk berkomunikasi dengan Entity Framework.
  • String koneksi database baru dalam file Web.config.

Cuplikan layar tampilan proyek Penjelajah Solusi. AdminController dot c s dan OrdersContext dot c s disorot.

Buka file OrdersContext.cs. Perhatikan bahwa konstruktor menentukan nama string koneksi database. Nama ini mengacu pada string koneksi yang ditambahkan ke Web.config.

public OrdersContext() : base("name=OrdersContext")

Tambahkan properti berikut ke OrdersContext kelas :

public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }

DbSet mewakili sekumpulan entitas yang dapat dikueri. Berikut adalah daftar lengkap untuk OrdersContext kelas :

public class OrdersContext : DbContext
{
    public OrdersContext() : base("name=OrdersContext")
    {
    }

    public DbSet<Order> Orders { get; set; }
    public DbSet<OrderDetail> OrderDetails { get; set; }
    public DbSet<Product> Products { get; set; }
}

Kelas ini AdminController mendefinisikan lima metode yang mengimplementasikan fungsionalitas CRUD dasar. Setiap metode sesuai dengan URI yang dapat dipanggil klien:

Metode Pengontrol Deskripsi URI Metode HTTP
GetProducts Mendapatkan semua produk. api/products GET
GetProduct Menemukan produk berdasarkan ID. api/products/id GET
PutProduct Updates produk. api/products/id PUT
PostProduct Membuat produk baru. api/products POST
DeleteProduct Menghapus produk. api/products/id DELETE

Setiap metode memanggil ke untuk OrdersContext mengkueri database. Metode yang memodifikasi panggilan db.SaveChanges koleksi (PUT, POST, dan DELETE) untuk mempertahankan perubahan pada database. Pengontrol dibuat per permintaan HTTP dan kemudian dibuang, sehingga perlu untuk mempertahankan perubahan sebelum metode kembali.

Menambahkan Penginisialisasi Database

Entity Framework memiliki fitur bagus yang memungkinkan Anda mengisi database saat startup, dan secara otomatis membuat ulang database setiap kali model berubah. Fitur ini berguna selama pengembangan, karena Anda selalu memiliki beberapa data pengujian, bahkan jika Anda mengubah model.

Di Penjelajah Solusi, klik kanan folder Model dan buat kelas baru bernama OrdersContextInitializer. Tempelkan implementasi berikut:

namespace ProductStore.Models
{
    using System;
    using System.Collections.Generic;
    using System.Data.Entity;

    public class OrdersContextInitializer : DropCreateDatabaseIfModelChanges<OrdersContext>
    {
        protected override void Seed(OrdersContext context)
        {
            var products = new List<Product>()            
            {
                new Product() { Name = "Tomato Soup", Price = 1.39M, ActualCost = .99M },
                new Product() { Name = "Hammer", Price = 16.99M, ActualCost = 10 },
                new Product() { Name = "Yo yo", Price = 6.99M, ActualCost = 2.05M }
            };

            products.ForEach(p => context.Products.Add(p));
            context.SaveChanges();

            var order = new Order() { Customer = "Bob" };
            var od = new List<OrderDetail>()
            {
                new OrderDetail() { Product = products[0], Quantity = 2, Order = order},
                new OrderDetail() { Product = products[1], Quantity = 4, Order = order }
            };
            context.Orders.Add(order);
            od.ForEach(o => context.OrderDetails.Add(o));

            context.SaveChanges();
        }
    }
}

Dengan mewarisi dari kelas DropCreateDatabaseIfModelChanges , kami memberi tahu Entity Framework untuk menghilangkan database setiap kali kami memodifikasi kelas model. Saat Entity Framework membuat (atau membuat ulang) database, ia memanggil metode Seed untuk mengisi tabel. Kami menggunakan metode Seed untuk menambahkan beberapa contoh produk ditambah contoh pesanan.

Fitur ini sangat bagus untuk pengujian, tetapi jangan gunakan kelas DropCreateDatabaseIfModelChanges dalam produksi, karena Anda dapat kehilangan data Jika seseorang mengubah kelas model.

Selanjutnya, buka Global.asax dan tambahkan kode berikut ke metode Application_Start :

System.Data.Entity.Database.SetInitializer(
    new ProductStore.Models.OrdersContextInitializer());

Mengirim Permintaan ke Pengontrol

Pada titik ini, kami belum menulis kode klien apa pun, tetapi Anda dapat memanggil API web menggunakan browser web atau alat penelusuran kesalahan HTTP seperti Fiddler. Di Visual Studio, tekan F5 untuk memulai penelusuran kesalahan. Browser web Anda akan terbuka ke http://localhost:*portnum*/, di mana portnum adalah beberapa nomor port.

Kirim permintaan HTTP ke "http://localhost:*portnum*/api/admin. Permintaan pertama mungkin lambat diselesaikan, karena Kerangka Kerja Entitas perlu membuat dan menyemai database. Responsnya harus mirip dengan yang berikut ini:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 18 Jun 2012 04:30:33 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 175
Connection: Close

[{"Id":1,"Name":"Tomato Soup","Price":1.39,"ActualCost":0.99},{"Id":2,"Name":"Hammer",
"Price":16.99,"ActualCost":10.00},{"Id":3,"Name":"Yo yo","Price":6.99,"ActualCost":
2.05}]