NOT A DUPLICATE :我的Update()方法需要两个参数:id和修改后的实体,并且提供给我的问题的答案有不同的方法,例如CurrentValues
,但并未涵盖在现有问题中。
我是ASP.Net核心开发的新手。我正在使用MySql构建一个简单的API作为数据库和Book模型。
我写了我的控制器如下:
[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();
}
}
和Repository如下:
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);
}
我不知道如何在我的Repo课程中编写UpdateBook
方法。有人可以帮我吗?我看到的所有教程都使用单个id参数到UpdateBook()方法,我基本上发布了一个json对象以及实体id。
答案 0 :(得分:8)
试试这个
public void UpdateBook(long id, Book book)
{
var originalBook= _db.Books.FirstOrDefault(o => o.Id == id);
_db.Entry(originalBook).CurrentValues.SetValues(book);
_db.SaveChanges();
}
请注意,您必须使用EFcore 1.1版才能使用
答案 1 :(得分:2)
最简单的方法是,只需从数据库中加载book即可。更新字段并将更改保存到数据库。
Book existingBook = GetBook(id);
existingBook.Title = book.Title;
// other properties
_db.SaveChanges();
答案 2 :(得分:0)
我认为Update方法应该做你想要的。高级想法是附加实体并将其状态设置为已修改,这正是Update方法所做的。
// Make sure that Book id is set correctly.
book.Id = id;
_db.Books.Update(book);
_db.SaveChanges();