C# 如何为实体框架已经跟踪的记录加载相关数据
我使用的是EntityFramework6,我的模型类是自动创建的,因为我首先使用的是数据库。我有以下两个(简化)课程: 正如我所说,这一切都被简化了。实际上,字段的值是从网页上的表单发布的,其中TeacherID的值是从下拉列表中选择的 创建记录后,我想立即填充一个C# 如何为实体框架已经跟踪的记录加载相关数据,c#,entity-framework,C#,Entity Framework,我使用的是EntityFramework6,我的模型类是自动创建的,因为我首先使用的是数据库。我有以下两个(简化)课程: 正如我所说,这一切都被简化了。实际上,字段的值是从网页上的表单发布的,其中TeacherID的值是从下拉列表中选择的 创建记录后,我想立即填充一个StudentViewModel,如下所示: public class StudentViewModel { public int ID { get; set; } public string StudentName
StudentViewModel
,如下所示:
public class StudentViewModel {
public int ID { get; set; }
public string StudentName { get; set; }
public string TeacherName { get; set; }
}
因此,在创建新学生记录的代码之后,我立即执行以下操作:
StudentViewModel model = new StudentViewModel()
{
ID = student.ID,
StudentName = student.StudentName,
TeacherName = student.Teacher.TeacherName
}
此代码引发空引用异常。我明白原因,我可以通过这样做来解决:
Student newStudent = db.Student
.Where(s => s.ID == student.ID)
.Include(s => s.Teacher)
.FirstOrDefault();
StudentViewModel model = new StudentViewModel()
{
ID = newStudent.ID,
StudentName = newStudent.StudentName,
TeacherName = newStudent.Teacher.TeacherName
};
我的问题是,鉴于EF已经在跟踪新的学生记录,是否有任何方式可以说“对于此记录,获取相关的教师记录”,即对已经跟踪的记录调用。Include
函数?或者总是需要调用数据库来获取我刚刚创建的记录并使用。包括?您可以使用:
db.Entry(student).Reference(s=>s.Teacher.Load();
但是,如果你是一个性能上瘾者(像我一样),你可能会觉得有必要阻止加载完整的教师
实体,而只从数据库中查询精益模型:
var model=db.student.Where(s=>s.ID==student.ID)
.选择(s=>new StudentViewModel
{
ID=s.ID,
StudentName=s.StudentName,
TeacherName=s.Teacher.TeacherName
}).FirstOrDefault();
无论如何,你总是需要一个数据库呼叫。@GertArnold想把它作为一个答案,这样我就可以接受了?
public class StudentViewModel {
public int ID { get; set; }
public string StudentName { get; set; }
public string TeacherName { get; set; }
}
StudentViewModel model = new StudentViewModel()
{
ID = student.ID,
StudentName = student.StudentName,
TeacherName = student.Teacher.TeacherName
}
Student newStudent = db.Student
.Where(s => s.ID == student.ID)
.Include(s => s.Teacher)
.FirstOrDefault();
StudentViewModel model = new StudentViewModel()
{
ID = newStudent.ID,
StudentName = newStudent.StudentName,
TeacherName = newStudent.Teacher.TeacherName
};