实体框架:对象引用未设置为对象的实例

use*_*621 7 c# mysql asp.net entity-framework

刚刚开始学习 Entity Framework 6,在将数据从我的 Web 应用程序添加到 MySQL 数据库时遇到问题。我觉得我做的一切都是正确的,但当我尝试使用代码优先方法向数据库添加某些内容时,我总是收到“System.NullReferenceException:对象引用未设置到对象的实例”。代码如下所示。

客户类别:

namespace LibraryManager.Models
{
     public class Customer
     {
        public int CustomerId { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
        public virtual ICollection<Book> BooksRead { get; set; }

        public Customer()
        {
            this.BooksRead = new List<Book>();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

图书类别:

namespace LibraryManager.Models
{
    public class Book
    {
        public int BookId { get; set; }
        public string Name { get; set; }
        public string Genre { get; set; }
        public double Rating { get; set; }
        public Boolean Available { get; set; }
        public string Author { get; set; }
        public string Desc { get; set; }
        public virtual Customer Customer { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

数据库管理器

public class DatabaseManager
{

    /**
     * Adds a book into the database
     */
    public void AddBook(Book book)
    {
        using (var ctx = new DatabaseContext())
        {
            ctx.Books.Add(book); -->Error Occurs here
            ctx.SaveChanges();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

上下文类

 public class DatabaseContext : DbContext
{
    public DbSet<Book> Books { get; set; }
    public DbSet<Customer> Customers { get; set; }

    public DatabaseContext() : base()
    {


    } 
}
Run Code Online (Sandbox Code Playgroud)

提前致谢

编辑:

调用AddBook的代码

  Book HarryPotter = new Book() { Name = "Chamber of Secrets", Genre = "Fantasy", Rating = 8.6, Available = true, Author = "J.K Rowling" };
  DatabaseManager manager = new DatabaseManager();
  manager.AddBook(HarryPotter);
Run Code Online (Sandbox Code Playgroud)

小智 2

第一。将键属性添加到 CustomerId 和 BookId 属性中。根据调用该方法的代码,您的 Customer 属性为 null,因此它失败,因为它无法与 null 客户建立外部关系。因此,要么在构造函数中指定客户,要么在 AddBook 中指定一个 null 检查器来检查 Customer 是否为 null,如果是则创建一个新客户。

public void AddBook(Book book)
{
    using (var ctx = new DatabaseContext())
    {
        ctx.Books.Add(book);

        if (boot.Customer == null)
            book.Customer = new Customer();

        ctx.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,您不想为每本书创建一个新客户(我假设),因此在您的图书构造函数中需要一个客户,以便可以在数据库中建立关系。还值得在方法中使用 try/catch 进行错误处理,以帮助您进行调试和跟踪。