Bagian 3: Membuat Pengontrol Admin
oleh Rick Anderson
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.
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".
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.OrdersContext
data .
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 padaProduct
instans. Ini menggunakanOrdersContext
kelas untuk berkomunikasi dengan Entity Framework. - String koneksi database baru dalam file Web.config.
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}]
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk