Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为实体框架已经跟踪的记录加载相关数据_C#_Entity Framework - Fatal编程技术网

C# 如何为实体框架已经跟踪的记录加载相关数据

C# 如何为实体框架已经跟踪的记录加载相关数据,c#,entity-framework,C#,Entity Framework,我使用的是EntityFramework6,我的模型类是自动创建的,因为我首先使用的是数据库。我有以下两个(简化)课程: 正如我所说,这一切都被简化了。实际上,字段的值是从网页上的表单发布的,其中TeacherID的值是从下拉列表中选择的 创建记录后,我想立即填充一个StudentViewModel,如下所示: public class StudentViewModel { public int ID { get; set; } public string StudentName

我使用的是EntityFramework6,我的模型类是自动创建的,因为我首先使用的是数据库。我有以下两个(简化)课程:

正如我所说,这一切都被简化了。实际上,字段的值是从网页上的表单发布的,其中TeacherID的值是从下拉列表中选择的

创建记录后,我想立即填充一个
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
};