Часть 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}]
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по