2

Я использую сначала код для генерации базы данных и данных во время выполнения.Вставьте данные в базу данных с отношением FK

Мои два класса/модели имеют отношения «один ко многим». Поскольку FK не может быть нулевым, я сначала вставляю Стандарт перед вставкой Студент, а также я также вручную вводим идентификатор FK. Но я все еще получаю System.NullReferenceException, и я просто не понимаю, почему?

Я пробовал поиск по Google, но не могу найти связанную статью о вставке данных с иностранными отношениями с нуля в код-первый.

Мой Entity Класс/Модель

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

My Main

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

ответ

2

Не вручную добавить StandardId, сделайте следующее:

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 примет уход за t он отношение.

+1

Согласен, не добавляйте сущности отдельно, но будьте осторожны при попытке обновить связанные таблицы под вашим корневым объектом. Иначе, чем операция «Добавить». Для обновления вам нужно выполнить итерацию по всему дереву и изменить их или «Прикрепить» их. – Deniz

+0

Вы имеете в виду даже с EF, мне все равно нужно прокручивать каждую запись и сравнивать ее исходное состояние и изменять их вручную? – KMC

+0

Для скалярных типов вам не о чем беспокоиться. Посмотрите на http://www.entityframeworktutorial.net/Types-of-Entities.aspx для типов сущностей. Однако для свойств навигации да, вы должны позаботиться о них отдельно, если работаете с отдельными объектами (насколько мне известно, обновления приветствуются). – Deniz