对象似乎没有保存到数据库中

时间:2014-09-17 17:15:19

标签: c# asp.net-mvc entity-framework

我正在使用实体框架代码优先和以下两个模型:

public class Exam
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreationDate { get; set; }
    public ICollection<Question> Questions { get; set; }
}

public class Question
{
    public enum Answers
    {
        A,
        B,
        C,
        D
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string AnswerA { get; set; }
    public string AnswerB { get; set; }
    public string AnswerC { get; set; }
    public string AnswerD { get; set; }
    public Answers Correct { get; set; }
}

上述两个模型显示ExamQuestion之间的关系; Exam有多个Question个。根据我的理解,实体框架可以正确地创建这种关系。代码优先。

但是,当我尝试读取Exam对象内的问题时(假设被添加到数据库之后),Exam对象显示Null Questions采集。为什么会这样?使用以下create方法正确创建对象。我已经通过它的过程进行了调试,Exam对象正确地分配了它的问题。

public ActionResult Create(ExamVM examVM)
{
    // Return if no questions were selected.
    if (examVM.Questions == null)
        return View(examVM);

    // Create database-exam object.
    QuestionaireDbContext db = new QuestionaireDbContext();
    Exam exam = new Exam();
    exam.Questions = new List<Question>();

    // Fill exam with selected questions.
    foreach (QuestionVM questionVM in examVM.Questions.Where(q => q.IsSelected))
        exam.Questions.Add(db.Questions.Find(questionVM.ID));

    exam.Name = examVM.Name;
    exam.CreationDate = DateTime.Today;

    // Validate exam.
    if (ModelState.IsValid)
    {
        db.Exams.Add(exam);
        db.SaveChanges();
        // Return to index if changes were applied.
        return RedirectToAction("Index");
    }

    // Return if exam isn't valid.
    return View(examVM);
}

请注意,在上面的方法中我使用&#34;帮助&#34;模型(ExamVM)将问题分配给考试。

重复一下这个问题:为什么我的Exam对象在从数据库查询时返回Null的{​​{1}}集合,同时它被正确创建并据称也正确地添加到数据库中?

我使用以下方法阅读考试:

Questions

考试中包含正确的名称等,但该集合显示为空。

这是public ActionResult TakeExam(int id) { QuestionaireDbContext db = new QuestionaireDbContext(); Exam exam = db.Exams.Find(id); return View("TakeExam", exam); } ,供参考:

DbContext

1 个答案:

答案 0 :(得分:2)

您需要通过将Questions属性设置为虚拟来启用延迟加载,或者使用

显式加载集合
dbContext.Exams.Include(e => e.Questions)