Bölüm 3: Yönetici Denetleyicisi Oluşturma

tarafından Rick Anderson

Tamamlanan Projeyi İndir

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.

Çözüm Gezgini denetleyicileri menüsünün ekran görüntüsü. Ekle seçeneği belirlenir ve Denetleyici vurgulanır.

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.

Denetleyici Ekle iletişim kutusunun ekran görüntüsü. Veri bağlamı sınıfı menüsü açık ve yeni veri bağlamı vurgulanmış.

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 kutusunun ekran görüntüsü. Metin kutusu, yazılan yeni veri bağlamının adını gösterir.

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ı AdminControllerbir Web API denetleyicisi. Bu denetleyici örneklerde Product 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.

Çözüm Gezgini proje görünümünün ekran görüntüsü. AdminController dot c s ve OrdersContext dot c s vurgulanır.

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ı OrdersContextInitializeryeni 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}]