2013-03-01 76 views
2

我是一位新的.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; 
    } 

回答

0

这里发生的是,在第一种情况下(Find),您从数据库中获取对象。 Course不是延迟加载,所以Course参考是null

在第二种情况下,您只定义一个查询但不执行它。我假设你循环播放结果,同时检查Course是否存在。这会导致Course被加载,因为您在执行时访问Course导航属性,它已成为查询的一部分。

如果你

var s = (from student in db.students where student.userId == 1 select student) 
     .Single(); 

你会发现,Course是空的,因为学生是没有在查询ececuted时刻(在Single语句)的引用Course牵强。

+0

在第一种情况下,即使我将懒加载设置为false(正如我在问题中所述)并尝试访问课程,它仍然会给我空值。任何想法为什么是这样。 – user1429007 2013-03-01 15:25:49

+1

是的,它永远不会延迟加载,因为该属性不是虚拟的。不考虑上下文的​​延迟加载设置。它仅由_eager loading_加载。也就是说,通过Include或通过在像Students.Select(s => s.Course)这样的linq查询中寻址,或通过Load方法。 – 2013-03-01 15:31:58

+1

我认为你的一部分混乱是“lazy = false”(在上下文级别)的相反并不意味着“eager = true”。使用“lazy = true”时,如果可能的话发生延迟加载(即使用'virtual'属性)。除非我上面提到的三个选项明确要求,否则“lazy = false”_no_加载将会发生。 – 2013-03-01 15:43:42

0

懒只加载初始对象被加载。为了获得第二个选项来检索课程信息,您需要在加载选项中指定。

DataLoadOptions dataLoadOptions = new DataLoadOptions(); 
dataLoadOptions.LoadWith<Customer>(c => c.Course); 
db.LoadOptions = dataLoadOptions; 

Student stdent = db.students.Find(c=>c.userid == 1).FirstOrDefault(); 
+0

问题是关于实体框架。 – 2013-03-01 07:26:46