2017-03-16 109 views
0

不是重复:请参阅评论和回答这个问题。ASP.Net核心NullReferenceException未由用户处理

我几乎是ASP.net核心开发的新手。我正在用MySql作为我的数据库构建一个示例web api。

的My Book型号:

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错误。我究竟做错了什么?

+0

嗯,我试图处理null建议在这篇文章,但没有帮助。 – Nitish

+0

您将控制器类中的_books分配给实现的位置?现在它在运行时没有初始化状态。除非你在构造函数中使用DI,否则不会发生这种情况,假设是你尝试去的路线。不是杜佩......只是误解他为什么在他的情况。 – mvermef

+0

这是我第一次尝试使用ASP.net Core,我正在关注本教程(https://joonasw.net/view/building-a-basic-web-api-on-asp-net-core)。我基本上尝试了与他相同的逻辑,但使用不同的模型。也许你可以给我正确的方式? – Nitish

回答

1

对于第一种情况下工作,你需要有

services.AddScoped<IBookRepository, BookRepository>(); 

在位于startup.cs

public class BooksController : Controller 
{ 
    public BooksController(IBookRepository books){ 
     _books = books; 
    } 
    ... 

现在这个假设你迷上了您的IBookRepository ConfigureServices方法包括在容器启动类中的Asp.NET Core。

如果不是那么这就是你所错过的!

public class BooksController : Controller 
{ 
    public BooksController(){ 
     _books = new BookRepository(); 
    } 

如果你从来没有使用依赖注入这个我建议你读了它工作之前,还推移IOC(控制反转)。

+0

好的,让我试试这个! – Nitish

+1

是的第一个解决方案工作!非常感谢!我基本上忽略了教程,它被提及。 – Nitish

相关问题