2017-10-21 55 views
0

刚刚开始学习实体框架6,并且无法将数据从我的Web应用程序添加到MySQL数据库。我觉得我做的一切都正确,但是当我尝试使用Code First方法向数据库添加某些内容时,我总是得到一个“System.NullReferenceException:Object reference没有设置为对象的实例”。代码如下所示。实体框架:对象引用未设置为对象的实例

Customer类:

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>(); 
     } 
    } 
} 

图书类:

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; } 
    } 
} 

的DatabaseManager

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(); 
     } 
    } 
} 

上下文类

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

    public DatabaseContext() : base() 
    { 


    } 
} 

在此先感谢

编辑:

代码调用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); 
+0

我们可以看到调用AddBook()方法的代码吗?我敢打赌你的参数被传入这个方法是null。 – Ratatoskr

+0

嗨,谢谢你的回复。我刚刚编辑了我的问题 – user7215621

+0

看到如何在添加之前创建书籍对象会更有趣。 –

回答

0

1日。为您的CustomerId和BookId属性添加一个关键属性。根据调用方法的代码,您的Customer属性为null,因此它失败是因为它无法与空客户建立外部关系。因此,要么在构造函数中指定客户,要么在AddBook中使用空检查器来检查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(); 
    } 
} 

然而,你不希望创建每本书(我假设)的新客户,所以需要在你的书构造一个客户,所以可以在数据库建立的关系。在你的方法中使用try/catch来处理错误也是值得的,以帮助你进行调试和跟踪。

+1

你不需要添加'[Key]'属性来使其工作。 'BookId'和'CustomerId'遵循约定(TableName + Id),这已经足够了。同样在当前的实体类定义中,'Customer_CustomerId'将成为Book表中的一个nullabe列。所以你仍然可以保存没有CustomerId的记录。在SQL服务器和EF 6中验证它。我假设它在mysql中的工作方式相同 – Shyju

+0

这也是我的理解,但我倾向于添加Key属性,仅仅是因为我有时想在主键中指定多个列,通常发现它可以帮助我更容易地实现代码背后的关系模型。 – Ratatoskr

相关问题