2017-10-21 35 views
0

J'ai tout juste commencé à apprendre Entity Framework 6 et j'ai du mal à ajouter des données de mon application Web à une base de données MySQL. Je sens que je fais tout bien mais je reçois toujours une "System.NullReferenceException: référence d'objet non définie à une instance d'un objet" quand j'essaye d'ajouter quelque chose à la base de données en utilisant une approche de code d'abord. Le code est montré ci-dessous.Entity Framework: Référence de l'objet non définie sur l'instance d'un objet

Classe client:

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

Classe livre:

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

classe Contexte

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

    public DatabaseContext() : base() 
    { 


    } 
} 

Merci à l'avance

EDIT:

code appelant 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

Je parierais que votre argument passé dans cette méthode est nul. – Ratatoskr

+0

Salut merci d'avoir répondu. Je viens d'éditer ma question – user7215621

+0

Il serait plus intéressant de voir comment vous créez un objet livre avant de l'ajouter. –

Répondre

0

1er. Ajoutez un attribut de clé à vos propriétés CustomerId et BookId. La propriété de votre client est Null basée sur votre code appelant la méthode, donc il échoue parce qu'il ne peut pas établir une relation étrangère avec un client nul. Donc, soit spécifier le client dans votre constructeur, ou un vérificateur nul dans votre AddBook pour vérifier si le client est nul, et pour créer un nouveau client si oui.

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

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

     ctx.SaveChanges(); 
    } 
} 

Cependant, vous ne voulez pas créer un nouveau client pour chaque livre (je suppose), donc besoin d'un client dans votre constructeur de livres, de sorte que la relation peut être établie dans le DB. Cela vaut également la peine d'utiliser un try/catch pour la gestion des erreurs dans votre méthode pour vous aider à déboguer et à tracer. Pouvons-nous voir le code qui appelle la méthode AddBook()?

+1

Vous n'avez pas besoin d'ajouter les attributs [Key] 'pour que cela fonctionne. 'BookId' et' CustomerId' suit la convention (TableName + Id) et c'est assez bon. De même, avec la définition de classe d'entité actuelle, Customer_CustomerId sera une colonne nullabe dans la table Book. Vous pouvez donc enregistrer un enregistrement sans CustomerId. Vérifié dans le serveur SQL et EF 6. Je suppose que cela fonctionne de la même manière dans mysql – Shyju

+0

C'était aussi ma compréhension, mais j'ai tendance à ajouter l'attribut clé juste parce que je tiens parfois à spécifier plusieurs colonnes dans ma clé primaire, et je En général, je trouve que cela m'aide à mieux comprendre le modèle relationnel derrière le code. – Ratatoskr