2

J'utilise le code-first pour générer la base de données et les données au moment de l'exécution.Insérer des données dans la base de données avec la relation FK

Mes deux classes/modèles ont une relation un-à-plusieurs. Comme un FK ne peut pas être nul, j'insère d'abord un Standard avant d'insérer un Etudiant, et je saisis aussi manuellement l'ID FK. Pourtant, je reçois toujours System.NullReferenceException et je ne peux pas comprendre pourquoi?

J'ai essayé googling mais je ne trouve pas l'article connexe sur l'insertion de données avec la relation étrangère de zéro dans le code d'abord.

Classe Mon Entité/Modèle

public class Student { 
    public Student() { } 
    public int StudentID { get; set; } 
    public string StudentName { get; set; } 

    public int StandardId { get; set; } // FK StandardId 
    public Standard Standard { get; set; } } 

public class Standard { 
    public Standard() { } 
    public int StandardId { get; set; } 
    public string StandardName { get; set; } 

    public ICollection<Student> Students { get; set; } } 

Mon principal

using (MyDbContext ctx = new MyDbContext()) 
{ 
    Standard std = new Standard(); 
    ctx.Standards.Add(std); 
    ctx.SaveChanges(); // Database already has a StandardID = 1 

    Student stud = new Student() 
    { 
     StudentName = "John", 
     StandardId = 1 // I even manually type in the FK 
    }; 

    ctx.Student.Add(stud); // I still get 'System.NullReferenceException' 
    ctx.SaveChanges(); 
} 

Répondre

2

Ne pas ajouter manuellement votre StandardId, faites ceci:

using (MyDbContext ctx = new MyDbContext()) 
{ 
    Standard std = new Standard(); 

    Student stud = new Student() 
    { 
     StudentName = "John", 
    }; 

    stud.Standard = std; 

    ctx.Student.Add(stud); 
    ctx.SaveChanges(); 
} 

EF prendra soin de t la relation.

+1

Je suis d'accord, n'ajoutez pas les entités séparément, mais soyez prudent lorsque vous essayez de mettre à jour les tables liées sous votre entité racine. C'est différent de l'opération "Add". Pour la mise à jour vous devez itérer sur l'ensemble de votre arbre et les modifier ou les 'attacher'. – Deniz

+0

Voulez-vous dire que même avec EF, je dois encore parcourir chaque entrée et comparer son état d'origine et les modifier manuellement? – KMC

+0

Pour les types scalaires, pas besoin de vous en préoccuper. Jetez un oeil à http://www.entityframeworktutorial.net/Types-of-Entities.aspx pour les types d'entités. Cependant, pour les propriétés de navigation, oui vous devez en prendre soin séparément si vous travaillez avec des objets détachés (pour autant que je sache, les mises à jour sont les bienvenues). – Deniz