Поделиться через


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

Рик Андерсон

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

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

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

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

Снимок экрана: меню

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

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

Примечание

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

Если выбрать "<Создать контекст данных",> откроется диалоговое окно Новый контекст данных . Назовите контекст ProductStore.Models.OrdersContextданных .

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

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

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

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

Снимок экрана: представление проекта

Откройте файл 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
GetProduct Находит продукт по идентификатору. api/products/id GET
PutProduct Обновления продукт. api/products/id PUT
PostProduct Создает продукт. api/products POST
DeleteProduct Удаляет продукт. 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*/, где 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}]