重複していません:この質問に対するコメントと回答を参照してください。ASP.NetコアNullReferenceExceptionがユーザーによって処理されませんでした
私はASP.netコア開発にはほとんど新しいです。私はデータベースとしてMySqlを使ってサンプルWeb APIを構築しています。
マイブックモデル:
public class Book
{
[Key]
public long Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Author { get; set; }
public DateTime CreatedOn { get; set; } = DateTime.UtcNow;
public Book()
{
}
}
public class WebAPIDataContext : DbContext
{
public WebAPIDataContext(DbContextOptions<WebAPIDataContext> options)
: base(options)
{
}
public DbSet<Book> Books { get; set; }
}
ブックリポジトリ:
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)
{
throw new NotImplementedException();
}
}
public interface IBookRepository
{
List<Book> GetAllBooks();
Book GetBook(long id);
Book CreateBook(Book book);
void UpdateBook(long id, Book book);
void DeleteBook(long id);
}
と書籍コントローラ:
[Route("api/[controller]")]
public class BooksController : Controller
{
private readonly IBookRepository _books;
[HttpGet("")]
public IActionResult GetAllBooks()
{
List<Book> books = _books.GetAllBooks();
return Ok(books);
}
[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);
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();
}
}
私は新しい本を作成するために闊歩からPOSTリクエストを行うと、それ私にNullReferenceException
エラーを与えます。私は間違って何をしていますか?この最初のケースが機能するために
私はこのポストで提案されたようにnullを処理しようとしましたが、助けにはなりませんでした。 – Nitish
コントローラクラスの_booksはどこに実装に割り当てられますか?現在のところ、実行時に初期化された状態はありません。 DIを使ってコンストラクタでそれをやっていなければ、あなたが行こうとしていたルートであると仮定します。 Dupeではない...ちょうどなぜ彼の事件の誤解。 – mvermef
これはASP.net Coreでの私の最初の試みであり、私はこのチュートリアル(https://joonasw.net/view/building-a-basic-web-api-on-asp-net-core)に従っていました。私は基本的に彼と同じロジックを試しましたが、異なるモデルで試しました。おそらくあなたは私に正しい方法を与えることができますか? – Nitish