.NET Web API (не Core) - создание операции исправления в контроллере Entity Framework - PullRequest
0 голосов
/ 18 сентября 2018

Я использую Entity Framework в .NET Web API (не Core) проекте с угловым интерфейсом. В настоящее время единственные примеры реализации исправлений, которые я могу найти, относятся к продуктам ASP.Net Core. Поэтому я хотел бы сначала подтвердить, возможно ли patch даже в простой старой версии * ASP.Net Web API (не Core) ,

Я хотел бы реализовать patch в некоторых из моих контроллеров, но по умолчанию контроллер Entity, похоже, не поставляется с кодом для операции исправления.Вместо этого он поставляется с GET, PUT, POST и DELETE.Какой код необходим в моем контроллере Entity, чтобы запросы на исправление действовали?Есть ли способ указать это при добавлении нового контроллера Entity, или он всегда должен вводиться вручную?

Мой контроллер:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;
using api.Models;
using api.Models.my_model;
using System.Net.Mail;
using System.Configuration;

namespace api.Controllers.my_model
{
    public class myController : ApiController
    {
        private myCodeFirst db = new myCodeFirst();

        // GET: api/my
        public IQueryable<myTable> GetmyTable()
        {
            return db.myTable;
        }

        // GET: api/my/5
        [ResponseType(typeof(myTable))]
        public IHttpActionResult GetmyTable(int id)
        {
            myTable myTable = db.myTable.Find(id);
            if (myTable == null)
            {
                return NotFound();
            }

            return Ok(myTable);
        }

        // PUT: api/my/5
        [ResponseType(typeof(void))]
        public IHttpActionResult PutmyTable(int id, myTable myTable)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != myTable.ID)
            {
                return BadRequest();
            }

            db.Entry(myTable).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!myTableExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return StatusCode(HttpStatusCode.NoContent);
        }

        // POST: api/my
        [ResponseType(typeof(myTable))]
        public IHttpActionResult PostmyTable(myTable myTable)
        {

            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            db.myTable.Add(myTable);


            db.SaveChanges();


            return CreatedAtRoute("DefaultApi", new { id = myTable.ID }, myTable);
        }

        // DELETE: api/my/5
        [ResponseType(typeof(myTable))]
        public IHttpActionResult DeletemyTable(int id)
        {
            myTable myTable = db.myTable.Find(id);
            if (myTable == null)
            {
                return NotFound();
            }

            db.myTable.Remove(myTable);
            db.SaveChanges();

            return Ok(myTable);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private bool myTableExists(int id)
        {
            return db.myTable.Count(e => e.ID == id) > 0;
        }


    }



}

1 Ответ

0 голосов
/ 19 сентября 2018

Метод PATCH - это метод запроса, поддерживаемый протоколом HTTP для внесения частичных изменений в существующий ресурс.Вы можете увидеть некоторые операции JSON Patch:

Добавить

{
    "op": "add",
    "path": "/a/b",
    "value": "foo"
}

Удалить

{
    "op": "remove",
    "path": "/a/b"
}

Заменить

{
    "op": "replace",
    "path": "/a/b",
    "value": "foo"
}

Копировать

{
    "op": "copy",
    "from": "/a/b",
    "path": "/a/c"
}

Переместить

{
    "op": "move",
    "from": "/a/b",
    "path": "/a/c"
}

Тест

{
    "op": "test",
    "path": "/a/b",
    "value": "foo"
}

В ASP.NET Core вы указываете методы исправления с атрибутом [HttpPatch].Для получения данных в этих методах вы должны использовать JsonPatchDocument<TModel> существовать в Microsoft.ApsNetCore.JsonPatch пространстве имен, где TModel - ваша сущность, которую вы хотите преобразовать в нее.Еще один полезный пакет - AutoMapper.Вы можете установить его из диспетчера пакетов NuGet, как показано ниже:

Install-Package AutoMapper

и сослаться на него в своем контроллере.

Теперь пришло время взглянуть на пример в ASP.NET Core Web API:

public async Task<IActionResult> PartiallyUpdateBook([FromRoute] Guid id, [FromBody] JsonPatchDocument<BookModel> patchDoc)
{
    // If the received data is null
    if (patchDoc == null)
    {
        return BadRequest();
    }

    // Retrieve book from database
    var book = await _context.Books.SingleOrDefaultAsync(x => x.Id == id)

    // Check if is the book exist or not
    if (book == null)
    {
        return NotFound();
    }

    // Map retrieved book to BookModel with other properties (More or less with eexactly same name)
    var bookToPatch = Mapper.Map<BookModel>(book);

    // Apply book to ModelState
    patchDoc.ApplyTo(bookToPatch, ModelState);

    // Use this method to validate your data
    TryValidateModel(bookToPatch);

    // If model is not valid, return the problem
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    // Assign entity changes to original entity retrieved from database
    Mapper.Map(bookToPatch, book);

    // Say to entity framework that you have changes in book entity and it's modified
    _context.Entry(book).State = EntityState.Modified;

    // Save changes to database
    await _context.SaveChangesAsync();

    // If everything was ok, return no content status code to users
    return NoContent();
}
...