实体框架查找结果与LINQ结果

时间:2013-03-01 05:58:45

标签: c# asp.net entity-framework

我是一名新的.NET开发人员。我有2个像这样的实体类

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; }
}

我正在使用像这样的数据库上下文

using (MyDbContext db = new MyDbContext())

使用

访问Student对象时
Student stdent = db.students.Find(1);

student对象中的native type(int,string)的成员变量包含值,但类型(Course)的课程变量返回null。

然而,当我使用

var result = from student in db.students where student.userId == 1 select student;

结果包含所有成员变量的值(此处存在整个课程对象)

这是预期的行为,还是我遗漏或忽略了什么?

我甚至在我的数据库上下文中添加了这个构造函数来禁用Lazy Loading但没有帮助

    public MyDbContext() : base()
    {
        this.Configuration.LazyLoadingEnabled = false;
    }

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

这里发生的是在第一种情况(Find)中从数据库中获取对象。 Course不是延迟加载,因此Course引用为null

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

如果你这样做

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

您会注意到Course为空,因为在查询被取消时(Course语句),学生被提取时没有引用Single