3. kısım: yönetici denetleyicisi oluşturmaPart 3: Creating an Admin Controller

, Mike te sonby Mike Wasson

Tamamlanmış projeyi indirDownload Completed Project

Yönetici denetleyicisi eklemeAdd an Admin Controller

Bu bölümde, ürünlerde CRUD (oluşturma, okuma, güncelleştirme ve silme) işlemlerini destekleyen bir Web API denetleyicisi ekleyeceğiz.In this section, we'll add a Web API controller that supports CRUD (create, read, update, and delete) operations on products. Denetleyici, veritabanı katmanıyla iletişim kurmak için Entity Framework kullanacaktır.The controller will use Entity Framework to communicate with the database layer. Bu denetleyici yalnızca yöneticiler tarafından kullanılabilir.Only administrators will be able to use this controller. Müşteriler, ürünlere başka bir denetleyici üzerinden erişir.Customers will access the products through another controller.

Çözüm Gezgini, denetleyiciler klasörüne sağ tıklayın.In Solution Explorer, right-click the Controllers folder. Ekle ve sonra Denetleyici' yi seçin.Select Add and then Controller.

Denetleyici Ekle iletişim kutusunda denetleyiciyi AdminControlleradlandırın.In the Add Controller dialog, name the controller AdminController. Şablonaltında Entity Framework"kullanarak okuma/yazma eylemleri Ile "API denetleyicisi ' ni seçin.Under Template, select "API controller with read/write actions, using Entity Framework". Model sınıfıaltında "Product (productstore. modeller)" öğesini seçin.Under Model class, select "Product (ProductStore.Models)". Veri bağlamıaltında "yeni veri bağlamı><" öğesini seçin.Under Data Context, select "<New Data Context>".

Note

Model sınıfı açılır liste herhangi bir model sınıfı göstermezse, projeyi derlediğinizden emin olun.If the Model class drop-down does not show any model classes, make sure you compiled the project. Entity Framework yansıma kullanır, bu nedenle derlenen derlemeye ihtiyaç duyuyor.Entity Framework uses reflection, so it needs the compiled assembly.

"<yeni veri bağlamı>" seçildiğinde, Yeni veri bağlamı iletişim kutusu açılır.Selecting "<New Data Context>" will open the New Data Context dialog. Veri bağlamını ProductStore.Models.OrdersContextolarak adlandırın.Name the data context ProductStore.Models.OrdersContext.

Yeni veri bağlamı iletişim kutusunu kapatmak için Tamam ' ı tıklatın.Click OK to dismiss the New Data Context dialog. Denetleyici Ekle Iletişim kutusunda Ekle' ye tıklayın.In the Add Controller dialog, click Add.

Projeye eklenen:Here's what got added to the project:

  • DbContext'ten türetilen OrdersContext adlı bir sınıf.A class named OrdersContext that derives from DbContext. Bu sınıf, POCO modelleri ve veritabanı arasında Tutkallamayı sağlar.This class provides the glue between the POCO models and the database.
  • AdminControlleradlı bir Web API denetleyicisi.A Web API controller named AdminController. Bu denetleyici Product örneklerine CRUD işlemlerini destekler.This controller supports CRUD operations on Product instances. Entity Framework iletişim kurmak için OrdersContext sınıfını kullanır.It uses the OrdersContext class to communicate with Entity Framework.
  • Web. config dosyasında yeni bir veritabanı bağlantı dizesi.A new database connection string in the Web.config file.

OrdersContext.cs dosyasını açın.Open the OrdersContext.cs file. Oluşturucunun, veritabanı bağlantı dizesinin adını belirttiğinden emin olun.Notice that the constructor specifies the name of the database connection string. Bu ad, Web. config dosyasına eklenen bağlantı dizesine başvurur.This name refers to the connection string that was added to Web.config.

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

Aşağıdaki özellikleri OrdersContext sınıfına ekleyin:Add the following properties to the OrdersContext class:

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

Bir Dbset , sorgulanabilen bir varlık kümesini temsil eder.A DbSet represents a set of entities that can be queried. OrdersContext sınıfı için tüm liste aşağıda verilmiştir:Here is the complete listing for the OrdersContext class:

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

AdminController sınıfı, temel CRUD işlevlerini uygulayan beş yöntemi tanımlar.The AdminController class defines five methods that implement basic CRUD functionality. Her yöntem, istemcinin çağırabileceği bir URI 'ye karşılık gelir:Each method corresponds to a URI that the client can invoke:

Controller yöntemiController Method AçıklamaDescription URIURI HTTP yöntemiHTTP Method
GetProductsGetProducts Tüm ürünleri alır.Gets all products. API/ürünlerapi/products GETGET
GetProductGetProduct KIMLIĞE göre bir ürün bulur.Finds a product by ID. API/ürünler/kimlikapi/products/id GETGET
PutProductPutProduct Bir ürünü güncelleştirir.Updates a product. API/ürünler/kimlikapi/products/id PUTPUT
PostProductPostProduct Yeni bir ürün oluşturur.Creates a new product. API/ürünlerapi/products POSTPOST
DeleteProductDeleteProduct Bir ürünü siler.Deletes a product. API/ürünler/kimlikapi/products/id DELETEDELETE

Her yöntem, veritabanını sorgulamak için OrdersContext çağırır.Each method calls into OrdersContext to query the database. Değişiklikleri veritabanında kalıcı hale getirmek için koleksiyonu değiştiren Yöntemler (PUT, POST ve DELETE) çağrısı db.SaveChanges.The methods that modify the collection (PUT, POST, and DELETE) call db.SaveChanges to persist the changes to the database. Denetleyiciler her HTTP isteği için oluşturulur ve sonra, bir yöntem döndürülmadan önce değişiklikleri kalıcı hale getirmek gerekir.Controllers are created per HTTP request and then disposed, so it is necessary to persist changes before a method returns.

Veritabanı başlatıcısı eklemeAdd a Database Initializer

Entity Framework, veritabanını başlangıçta doldurmanıza ve modeller değiştiğinde veritabanını otomatik olarak yeniden oluşturmaya olanak tanıyan iyi bir özelliğe sahiptir.Entity Framework has a nice feature that lets you populate the database on startup, and automatically recreate the database whenever the models change. Bu özellik geliştirme sırasında faydalıdır, çünkü modelleri değiştirseniz bile, her zaman test verilerinize sahip olursunuz.This feature is useful during development, because you always have some test data, even if you change the models.

Çözüm Gezgini, modeller klasörüne sağ tıklayın ve OrdersContextInitializeradlı yeni bir sınıf oluşturun.In Solution Explorer, right-click the Models folder and create a new class named OrdersContextInitializer. Aşağıdaki uygulamada yapıştırın:Paste in the following implementation:

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, model sınıflarını her değiştirtiğimiz zaman veritabanını Entity Framework.By inheriting from the DropCreateDatabaseIfModelChanges class, we are telling Entity Framework to drop the database whenever we modify the model classes. Entity Framework veritabanını oluşturduğunda (veya yeniden oluşturduğunda) tabloları doldurmak için çekirdek yöntemini çağırır.When Entity Framework creates (or recreates) the database, it calls the Seed method to populate the tables. Örnek bir sipariş ve örnek bir sipariş eklemek için çekirdek yöntemi kullanıyoruz.We use the Seed method to add some example products plus an example order.

Bu özellik test için idealdir, ancak bir model sınıfı değiştirirse verilerinizi kaybedeceğinizi, üretim ortamında Dropcreatedatabaseifmodelchanges sınıfını kullanmayın.This feature is great for testing, but don't use the DropCreateDatabaseIfModelChanges class in production,, because you could lose your data if someone changes a model class.

Ardından, Global. asax dosyasını açın ve aşağıdaki kodu uygulama_başlangıç yöntemine ekleyin:Next, open Global.asax and add the following code to the Application_Start method:

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

Denetleyiciye Istek göndermeSend a Request to the Controller

Bu noktada hiçbir istemci kodu yazmadınız, ancak Web API 'sini bir Web tarayıcısı veya Fiddlergıbı bir http hata ayıklama aracı kullanarak çağırabilirsiniz.At this point, we haven't written any client code, but you can invoke the web API using a web browser or an HTTP debugging tool such as Fiddler. Visual Studio 'da hata ayıklamayı başlatmak için F5 tuşuna basın.In Visual Studio, press F5 to start debugging. Web tarayıcınız http://localhost:*portnum*/için açılır; burada portnum , bir bağlantı noktası numarasıdır.Your web browser will open to http://localhost:*portnum*/, where portnum is some port number.

"http://localhost:*portnum*/api/adminöğesine HTTP isteği gönderin.Send an HTTP request to "http://localhost:*portnum*/api/admin. Entity Framework veritabanının oluşturulması ve sağlaması gerektiğinden, ilk isteğin tamamlanabilmesi yavaş olabilir.The first request may be slow to complete, because Entity Framework needs to create and seed the database. Yanıt aşağıdakine benzer bir şey olmalıdır:The response should something similar to the following:

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