Bölüm 3: Yönetici Denetleyicisi Oluşturma
tarafından Rick Anderson
Yönetici Denetleyicisi Ekleme
Bu bölümde, ürünlerde CRUD (oluşturma, okuma, güncelleştirme ve silme) işlemlerini destekleyen bir Web API denetleyicisi ekleyeceğiz. Denetleyici, veritabanı katmanıyla iletişim kurmak için Entity Framework kullanır. Bu denetleyiciyi yalnızca yöneticiler kullanabilir. Müşteriler ürünlere başka bir denetleyici üzerinden erişecektir.
Çözüm Gezgini'da Denetleyiciler klasörüne sağ tıklayın. Ekle'yi ve ardından Denetleyici'yi seçin.
Denetleyici Ekle iletişim kutusunda denetleyiciyi olarak adlandırınAdminController
. Şablon'un altında "Entity Framework kullanarak okuma/yazma eylemleriyle API denetleyicisi"ni seçin. Model sınıfı'nın altında "Product (ProductStore.Models)" öğesini seçin. Veri Bağlamı'nın altında "<Yeni Veri Bağlamı>" öğesini seçin.
Not
Model sınıfı açılan listesinde herhangi bir model sınıfı gösterilmiyorsa, projeyi derlediğinizden emin olun. Entity Framework yansıma kullandığından derlenmiş derlemeye ihtiyaç duyar.
"<Yeni Veri Bağlamı>" seçildiğinde Yeni Veri Bağlamı iletişim kutusu açılır. Veri bağlamını olarak adlandırın ProductStore.Models.OrdersContext
.
Yeni Veri Bağlamı iletişim kutusunu kapatmak için Tamam'a tıklayın. Denetleyici Ekle iletişim kutusunda Ekle'ye tıklayın.
Projeye eklenenler şunlardır:
- DbContext'ten türetilen adlı
OrdersContext
bir sınıf. Bu sınıf POCO modelleri ile veritabanı arasında tutkal sağlar. - adlı
AdminController
bir Web API denetleyicisi. Bu denetleyici örneklerdeProduct
CRUD işlemlerini destekler. Entity Framework ile iletişim kurmak için sınıfınıOrdersContext
kullanır. - Web.config dosyasında yeni bir veritabanı bağlantı dizesi.
OrdersContext.cs dosyasını açın. Oluşturucunun veritabanı bağlantı dizesinin adını belirttiğine dikkat edin. Bu ad, Web.config eklenen bağlantı dizesine başvurur.
public OrdersContext() : base("name=OrdersContext")
Sınıfına aşağıdaki özellikleri OrdersContext
ekleyin:
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
DbSet sorgulanabilen bir varlık kümesini temsil eder. Sınıfın tam listesi aşağıdadır OrdersContext
:
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; }
}
sınıfı, AdminController
temel CRUD işlevselliğini uygulayan beş yöntemi tanımlar. Her yöntem, istemcinin çağırabileceği bir URI'ye karşılık gelir:
Denetleyici Yöntemi | Description | URI | HTTP Yöntemi |
---|---|---|---|
GetProducts | Tüm ürünleri alır. | api/products | GET |
GetProduct | Kimliğine göre bir ürün bulur. | api/products/id | GET |
PutProduct | Bir ürünü Güncelleştirmeler. | api/products/id | PUT |
PostProduct | Yeni bir ürün oluşturur. | api/products | POST |
DeleteProduct | Bir ürünü siler. | api/products/id | DELETE |
Her yöntem, veritabanını sorgulamak için çağrısında OrdersContext
bulunur. Veritabanındaki değişiklikleri kalıcı hale getirmek için koleksiyonu (PUT, POST ve DELETE) değiştiren yöntemler.db.SaveChanges
Denetleyiciler HTTP isteği başına oluşturulur ve sonra atılır, bu nedenle bir yöntem dönmeden önce değişiklikleri kalıcı hale getirmek gerekir.
Veritabanı Başlatıcı ekleme
Entity Framework, başlangıçta veritabanını doldurmanıza ve modeller her değiştiğinde veritabanını otomatik olarak yeniden oluşturmanıza olanak tanıyan güzel bir özelliğe sahiptir. Modelleri değiştirseniz bile her zaman bazı test verileriniz olduğundan bu özellik geliştirme sırasında kullanışlıdır.
Çözüm Gezgini'da Models klasörüne sağ tıklayın ve adlı OrdersContextInitializer
yeni bir sınıf oluşturun. Aşağıdaki uygulamayı yapıştırın:
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();
}
}
}
DropCreateDatabaseIfModelChanges sınıfından devralarak Entity Framework'e model sınıflarını her değiştirdiğimizde veritabanını bırakmasını söylüyoruz. Entity Framework veritabanını oluşturduğunda (veya yeniden oluşturduğunda), tabloları doldurmak için Seed yöntemini çağırır. Bazı örnek ürünlerin yanı sıra örnek bir sipariş eklemek için Seed yöntemini kullanırız.
Bu özellik test etmek için harikadır, ancak üretimde DropCreateDatabaseIfModelChanges sınıfını kullanmayın çünkü birisi model sınıfını değiştirirse verilerinizi kaybedebilirsiniz.
Ardından Global.asax dosyasını açın ve Application_Start yöntemine aşağıdaki kodu ekleyin:
System.Data.Entity.Database.SetInitializer(
new ProductStore.Models.OrdersContextInitializer());
Denetleyiciye İstek Gönderme
Bu noktada herhangi bir istemci kodu yazmadık, ancak bir web tarayıcısı veya Fiddler gibi bir HTTP hata ayıklama aracı kullanarak web API'sini çağırabilirsiniz. Visual Studio'da hata ayıklamayı başlatmak için F5 tuşuna basın. Web tarayıcınız için açılır http://localhost:*portnum*/
; burada portnum bir bağlantı noktası numarasıdır.
"http://localhost:*portnum*/api/admin
. adresine bir HTTP isteği gönderin. Entity Framework'ün veritabanını oluşturması ve sağlaması gerektiğinden ilk istek yavaş tamamlanabilir. Yanıt aşağıdakine benzer bir şey olmalıdır:
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}]