NON UN DUPLICATO : I metodi My Update () prendono due argomentazioni: id e entità modificata, e le risposte fornite alla mia domanda hanno un approccio diverso come CurrentValues
che non è trattato nelle domande esistenti.
Sono nuovo nello sviluppo del core ASP.Net. Sto costruendo una semplice API con MySql come database e con un modello Book.
Ho scritto il mio controller come segue:
[Route("api/[controller]")]
public class BooksController : Controller
{
private readonly IBookRepository _books;
public BooksController(IBookRepository books)
{
_books = books;
}
[HttpGet("")]
public IActionResult GetAllBooks()
{
try
{
List<Book> books = _books.GetAllBooks();
return Ok(books);
}
catch(EntityNotFoundException<Book>)
{
return NotFound();
}
}
[HttpGet("{id}")]
public IActionResult GetBook(long id)
{
Book book = _books.GetBook(id);
if (book == null)
{
return NotFound();
}
return Ok(book);
}
[HttpPost]
public IActionResult CreateBook([FromBody] Book book)
{
if (ModelState.IsValid == false)
{
return BadRequest(ModelState);
}
Book createdBook = _books.CreateBook(book);
if (createdBook == null)
{
return NotFound();
}
return CreatedAtAction(
nameof(GetBook), new { id = createdBook.Id }, createdBook);
}
[HttpPut("{id}")]
public IActionResult UpdateBook(long id, [FromBody] Book book)
{
if (ModelState.IsValid == false)
{
return BadRequest(ModelState);
}
try
{
_books.UpdateBook(id, book);
return Ok();
}
catch (EntityNotFoundException<Book>)
{
return NotFound();
}
}
[HttpDelete("{id}")]
public IActionResult DeleteBook(long id)
{
_books.DeleteBook(id);
return Ok();
}
}
E deposito come segue:
public class BookRepository: IBookRepository
{
private readonly WebAPIDataContext _db;
public BookRepository(WebAPIDataContext db) {
_db = db;
}
public Book CreateBook(Book book) {
_db.Books.Add(book);
_db.SaveChanges();
return book;
}
public void DeleteBook(long id)
{
Book book = GetBook(id);
if (book != null) {
_db.Books.Remove(book);
_db.SaveChanges();
}
}
public List<Book> GetAllBooks()
{
return _db.Books.AsNoTracking().ToList();
}
public Book GetBook(long id)
{
return _db.Books.FirstOrDefault(o => o.Id == id);
}
public void UpdateBook(long id, Book book)
{
}
}
public interface IBookRepository
{
List<Book> GetAllBooks();
Book GetBook(long id);
Book CreateBook(Book book);
void UpdateBook(long id, Book book);
void DeleteBook(long id);
}
Non sono sicuro di come posso scrivere il metodo UpdateBook
nella mia classe Repo. Qualcuno può aiutarmi per favore? Tutti i tutorial che ho visto utilizzavano il parametro id singolo per il metodo UpdateBook (), in pratica sto pubblicando anche un oggetto json insieme all'ID entità.
Prova questo
public void UpdateBook(long id, Book book)
{
var originalBook= _db.Books.FirstOrDefault(o => o.Id == id);
_db.Entry(originalBook).CurrentValues.SetValues(book);
_db.SaveChanges();
}
Si prega di notare che è necessario utilizzare EFcore versione 1.1 affinché funzioni