我是一位新的.NET开发人员。我有2个实体类,这样实体框架查找结果vs LINQ结果
public class Student
{
public int userId { get; set; }
public string username { get; set; }
public string firstname { get; set; }
public string lastname { get; set; }
public string email { get; set; }
public Course course { get; set; }
}
public class Course
{
[Key]
public int courseId { get; set; }
public String courseName { get; set; }
}
我使用DB语境对象像这样
using (MyDbContext db = new MyDbContext())
当我访问使用
Student stdent = db.students.Find(1);
原始类型的成员变量的Student对象(int,string)包含值,但课程变量类型(Course)返回null。
然而,当我使用
var result = from student in db.students where student.userId == 1 select student;
结果包含值,所有成员变量(整个课程的对象是目前这里)
这是预期的行为还是我丢失或忽视的东西?
我甚至在我的数据库上下文添加此构造函数来禁用延迟加载,但并没有帮助
public MyDbContext() : base()
{
this.Configuration.LazyLoadingEnabled = false;
}
在第一种情况下,即使我将懒加载设置为false(正如我在问题中所述)并尝试访问课程,它仍然会给我空值。任何想法为什么是这样。 – user1429007 2013-03-01 15:25:49
是的,它永远不会延迟加载,因为该属性不是虚拟的。不考虑上下文的延迟加载设置。它仅由_eager loading_加载。也就是说,通过Include或通过在像Students.Select(s => s.Course)这样的linq查询中寻址,或通过Load方法。 – 2013-03-01 15:31:58
我认为你的一部分混乱是“lazy = false”(在上下文级别)的相反并不意味着“eager = true”。使用“lazy = true”时,如果可能的话发生延迟加载(即使用'virtual'属性)。除非我上面提到的三个选项明确要求,否则“lazy = false”_no_加载将会发生。 – 2013-03-01 15:43:42