2

我是一名新的 .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);

学生对象中本机类型(int,string)的成员变量包含值,但类型(Course)的课程变量返回null。

然而,当我使用

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

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

这是预期的行为还是我错过或忽略了什么?

我什至在我的数据库上下文中添加了这个构造函数来禁用延迟加载但没有帮助

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

2 回答 2

0

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

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

Student stdent = db.students.Find( c=>c.userid == 1).FirstOrDefault();
于 2013-03-01T06:06:23.897 回答
0

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

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

如果你这样做

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

您会注意到它是空的,因为在执行查询时(语句)Course没有引用学生就被提取了。CourseSingle

于 2013-03-01T07:47:08.663 回答