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