我正在使用实体框架代码优先和以下两个模型:
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; }
}
上述两个模型显示Exam
和Question
之间的关系; 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
答案 0 :(得分:2)
您需要通过将Questions属性设置为虚拟来启用延迟加载,或者使用
显式加载集合dbContext.Exams.Include(e => e.Questions)