Поиск…


Установка пакетов OData

В меню «Сервис» выберите «Диспетчер пакетов NuGet»> «Менеджер пакетов». В окне консоли диспетчера пакетов введите:

Install-Package Microsoft.AspNet.Odata

Эта команда устанавливает последние пакеты OData NuGet.

Включить платформу Entity Framework

В этом учебнике мы будем использовать код Entity Framework (EF) First для создания базы данных.

Web API OData не требует EF. Используйте любой уровень доступа к данным, который может преобразовывать объекты базы данных в модели.

Сначала установите пакет NuGet для EF. В меню « Сервис» выберите « Диспетчер пакетов NuGet» > « Менеджер пакетов» . В окне консоли диспетчера пакетов введите:

Install-Package EntityFramework

Откройте файл Web.config и добавьте следующий раздел внутри элемента конфигурации после элемента configSections .

<configuration>
  <configSections>
    <!-- ... -->
  </configSections>

  <!-- Add this: -->
  <connectionStrings>
    <add name="ProductsContext" connectionString="Data Source=(localdb)\v11.0; 
        Initial Catalog=ProductsContext; Integrated Security=True; MultipleActiveResultSets=True; 
        AttachDbFilename=|DataDirectory|ProductsContext.mdf"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

Этот параметр добавляет строку подключения для базы данных LocalDB. Эта база данных будет использоваться при локальном запуске приложения.

Затем добавьте класс с именем ProductsContext в папку Models:

using System.Data.Entity;
namespace ProductService.Models
{
    public class ProductsContext : DbContext
    {
        public ProductsContext() 
                : base("name=ProductsContext")
        {
        }
        public DbSet<Product> Products { get; set; }
    }
}

В конструкторе «name = ProductsContext» указывает имя строки подключения.

Настройка конечной точки OData

Откройте файл App_Start / WebApiConfig.cs. Добавьте следующие используя оператор:

using ProductService.Models;
using System.Web.OData.Builder;
using System.Web.OData.Extensions;

Затем добавьте следующий код в метод Register :

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // New code:
        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Product>("Products");
        config.MapODataServiceRoute(
            routeName: "ODataRoute",
            routePrefix: null,
            model: builder.GetEdmModel());
    }
}

Этот код выполняет две функции:

  • Создает модель данных сущности (EDM).
  • Добавляет маршрут.

EDM - это абстрактная модель данных. EDM используется для создания документа метаданных службы. Класс ODataConventionModelBuilder создает EDM, используя соглашения об именах по умолчанию. Этот подход требует наименьшего кода. Если вы хотите больше контролировать EDM, вы можете использовать класс ODataModelBuilder для создания EDM, добавив свойства, ключи и свойства навигации явно.

Маршрут сообщает Web API, как перенаправить HTTP-запросы на конечную точку. Чтобы создать маршрут OData v4, вызовите метод расширения MapODataServiceRoute .

Если ваше приложение имеет несколько конечных точек OData, создайте отдельный маршрут для каждого. Дайте каждому маршруту уникальное имя и префикс маршрута.

Добавить контроллер OData

Контроллер - это класс, который обрабатывает HTTP-запросы. Вы создаете отдельный контроллер для каждого объекта, установленного в вашей службе OData. В этом учебнике вы создадите один контроллер для объекта Product.

В обозревателе решений щелкните правой кнопкой мыши папку «Контроллеры» и выберите « Добавить» > « Класс» . Назовите класс ProductsController.

Версия этого руководства для OData v3 использует Add Addler. В настоящее время для OData v4 нет лесов.

Замените код шаблона в ProductsController.cs следующим образом.

using ProductService.Models;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.OData;
namespace ProductService.Controllers
{
    public class ProductsController : ODataController
    {
        ProductsContext db = new ProductsContext();
        private bool ProductExists(int key)
        {
            return db.Products.Any(p => p.Id == key);
        } 
        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}

Контроллер использует класс ProductsContext для доступа к базе данных с использованием EF. Обратите внимание на то, что контроллер перекрывает Dispose метод распоряжаться ProductsContext.

Это отправная точка для контроллера. Затем мы добавим методы для всех операций CRUD.

Выполнение CRUD в наборе объектов

Запрос набора объектов

Добавьте следующие методы в ProductController .

[EnableQuery]
public IQueryable<Product> Get()
{
    return db.Products;
}

[EnableQuery]
public SingleResult<Product> Get([FromODataUri] int key)
{
    IQueryable<Product> result = db.Products.Where(p => p.Id == key);
    return SingleResult.Create(result);
}

Безпараметрическая версия метода Get возвращает всю коллекцию продуктов. Метод Get с ключевым параметром ищет продукт по его ключу (в этом случае свойство Id).

Атрибут [EnableQuery] позволяет клиентам изменять запрос, используя параметры запроса, такие как $ filter, $ sort и $ page. Дополнительные сведения см. В разделе « Поддержка параметров запроса OData» .

Добавление объекта в набор объектов

Чтобы клиенты могли добавить новый продукт в базу данных, добавьте следующий метод в ProductController .

public async Task<IHttpActionResult> Post(Product product)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    db.Products.Add(product);
    await db.SaveChangesAsync();
    return Created(product);
}

Обновление объекта

OData поддерживает две различные семантики для обновления объекта, PATCH и PUT.

  • PATCH выполняет частичное обновление. Клиент указывает только свойства для обновления.
  • PUT заменяет весь объект.

Недостатком PUT является то, что клиент должен отправлять значения для всех свойств в сущности, включая значения, которые не изменяются. Спецификация OData указывает, что PATCH является предпочтительным.

В любом случае, вот код для методов PATCH и PUT:

public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<Product> product)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    var entity = await db.Products.FindAsync(key);
    if (entity == null)
    {
        return NotFound();
    }
    product.Patch(entity);
    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(key))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }
    return Updated(entity);
}

public async Task<IHttpActionResult> Put([FromODataUri] int key, Product update)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    if (key != update.Id)
    {
        return BadRequest();
    }
    db.Entry(update).State = EntityState.Modified;
    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(key))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }
    return Updated(update);
}

В случае PATCH контроллер использует тип Delta <T> для отслеживания изменений.

Удаление объекта

Чтобы клиенты могли удалять продукт из базы данных, добавьте следующий метод в ProductController .

public async Task<IHttpActionResult> Delete([FromODataUri] int key)
{
    var product = await db.Products.FindAsync(key);
    if (product == null)
    {
        return NotFound();
    }
    db.Products.Remove(product);
    await db.SaveChangesAsync();
    return StatusCode(HttpStatusCode.NoContent);
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow