尽管这些对象的显式加载已经完成,但Entity Framework还是会启动查询来加载相关对象。

问题描述 投票:0回答:2

我有这些模型和上下文在我的应用程序。

      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查询来加载部门属性。

entity-framework entity-framework-6 query-optimization dbcontext
2个回答
2
投票

很明显,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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.