Часть 3. Создание контроллера администрирования

Рик Андерсон

Скачивание завершенного проекта

Добавление контроллера администрирования

В этом разделе мы добавим контроллер веб-API, поддерживающий операции CRUD (создание, чтение, обновление и удаление) для продуктов. Контроллер будет использовать Entity Framework для взаимодействия с уровнем базы данных. Только администраторы смогут использовать этот контроллер. Клиенты получат доступ к продуктам с помощью другого контроллера.

В обозревателе решений щелкните правой кнопкой мыши папку Контроллеров. Выберите "Добавить" и "Контроллер".

Снимок экрана: меню контроллеров обозревателя решений. Выбран параметр добавления и выделен контроллер.

В диалоговом окне добавления контроллера назовите контроллер AdminController. В разделе "Шаблон" выберите "Контроллер API с действиями чтения и записи с помощью Entity Framework". В разделе "Класс модели" выберите "Product (ProductStore.Models)". В разделе "Контекст данных" выберите "<Новый контекст> данных".

Снимок экрана: диалоговое окно

Замечание

Если раскрывающийся список "Класс модели " не отображает классы моделей, убедитесь, что вы скомпилировали проект. Entity Framework использует отражение, поэтому он нуждается в скомпилированной сборке.

При выборе "<Новый контекст данных" откроется диалоговое окно > данных". Присвойте контексту ProductStore.Models.OrdersContextданных имя.

Снимок экрана: диалоговое окно нового контекста данных. В текстовом поле отображается имя нового контекста данных, введенного в.

Нажмите кнопку "ОК ", чтобы закрыть диалоговое окно "Новый контекст данных ". В диалоговом окне "Добавить контроллер" нажмите кнопку "Добавить".

Вот что добавлено в проект:

  • Класс с именем OrdersContext , производным от DbContext. Этот класс предоставляет клей между моделями POCO и базой данных.
  • Контроллер веб-API с именем AdminController. Этот контроллер поддерживает операции CRUD с экземплярами Product. Он использует OrdersContext класс для взаимодействия с Entity Framework.
  • Новая строка подключения к базе данных в файле Web.config.

Снимок экрана представления проекта в обозревателе решений. Выделены AdminController.cs и OrdersContext.cs.

Откройте файл OrdersContext.cs. Обратите внимание, что конструктор задает имя строки подключения к базе данных. Это имя ссылается на строку подключения, добавленную в Web.config.

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

Добавьте в класс OrdersContext следующие свойства:

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

DbSet представляет набор сущностей, которые можно запрашивать. Ниже приведен полный список для 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; }
}

Класс AdminController определяет пять методов, реализующих основные функции CRUD. Каждый метод соответствует универсальному коду ресурса (URI), который может вызвать клиент:

Метод контроллера Описание URI Метод HTTP
GetProducts Возвращает все продукты. api/products GET
ПолучитьПродукт Находит продукт по идентификатору. api/products/id GET
PutProduct Обновляет продукт. api/products/id ЗАПИСАТЬ
PostProduct Создает новый продукт. api/products ПОСТ
УдалитьПродукт Удаляет продукт. api/products/id DELETE

Каждый метод вызывает OrdersContext, чтобы выполнить запрос к базе данных. Методы, которые изменяют коллекцию (PUT, POST и DELETE), вызывают db.SaveChanges, чтобы сохранить изменения в базе данных. Контроллеры создаются для каждого HTTP-запроса, а затем удаляются, поэтому необходимо сохранить изменения перед возвратом метода.

Добавление инициализатора базы данных

Entity Framework имеет хорошую функцию, которая позволяет заполнять базу данных при запуске и автоматически создавать базу данных при изменении моделей. Эта функция полезна во время разработки, так как у вас всегда есть тестовые данные, даже если вы изменяете модели.

В обозревателе решений щелкните правой кнопкой мыши папку Models и создайте новый класс с именем OrdersContextInitializer. Вставьте следующую реализацию:

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 , мы сообщаем Entity Framework удалять базу данных при изменении классов модели. Когда Entity Framework создает (или повторно создает) базу данных, она вызывает метод Seed для заполнения таблиц. Мы используем метод Seed для добавления некоторых примеров продуктов и примера заказа.

Эта функция отлично подходит для тестирования, но не используйте класс DropCreateDatabaseIfModelChanges в рабочей среде, так как вы можете потерять данные, если кто-то изменяет класс модели.

Затем откройте Global.asax и добавьте следующий код в метод Application_Start :

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

Отправка запроса контроллеру

На этом этапе мы не написали код клиента, но вы можете вызвать веб-API с помощью веб-браузера или средства отладки HTTP, например Fiddler. В Visual Studio нажмите клавишу F5, чтобы начать отладку. Ваш веб-браузер откроется на http://localhost:*portnum*/, где портнум — это некоторый номер порта.

Отправьте HTTP-запрос на "http://localhost:*portnum*/api/admin. Первый запрос может быть медленным, так как Entity Framework должен создавать и заполнять базу данных. Ответ должен выглядеть примерно так:

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