我有这些模型和上下文在我的应用程序。
public class Department
{
public int Id { get; set; }
public string Name { get; set;}
public virtual ICollection<Student> Students { get; set; }
}
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Department Department { get; set; }
}
public class TestContext : DbContext
{
public DbSet<Student> Students { get; set; }
public DbSet<Department> Departments { get; set; }
}
下面是我的代码在Program.cs类。
class Program
{
static void Main(string[] args)
{
using (var context = new TestContext())
{
var students = context.Students.SqlQuery("Select * from dbo.Students").ToList();
context.Departments.Load();
Console.WriteLine(students[0].Department.Name);
Console.ReadLine();
}
}
}
虽然相关的对象 - 部门被加载在上下文中的行 - 。context.Departments.Load()当在控制台打印部门名称时,实体框架仍然会在数据库中启动一个查询来获取相关对象。由于对象已经在上下文中被加载,所以这个相关对象的查询不应该被触发。?
如果我把代码改成下面这个样子
var students = context.Students.ToList();
context.Departments.Load();
Console.WriteLine(students[0].Department.Name);
然后,当你访问 student[0].Department.Name时,Ef没有启动sql查询来加载部门属性。
很明显,Change Tracker关系的修复不能与独立关联和原始SQL查询的组合一起工作。
要修复只需添加外键属性到学生。
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int DepartmentId { get; set; }
public virtual Department Department { get; set; }
}