LINQ子记录为null

时间:2012-07-20 15:35:31

标签: c# linq entity-framework

我使用Entity Framework来创建我的数据库模式并生成我的代码。我有一个名为Employee的表,它在DaysOff表中有子记录。 DaysOff有一个Employee的外键,我的模型中有一个1到*的关联。我在Employee表上运行了一个LINQ查询,并期望我的Domain.Employee对象将填充DaysOff,但DaysOff为null。当我在对象中向下钻取时,我看到“employee.DaysOff.Count引发了System.ObjectDisposedException类型的异常”。我认为儿童记录会被填充是错误的吗?我该怎么做?这是我打电话给我的员工的方法:

public static Domain.Employee SelectEmployee(int employeeId)
{
    using (var db = new EmployeeEntities())
    {

        Domain.Employee emp = (from e in db.Employees
                       where e.EmployeeId == employeeId
                       select e
                             ).FirstOrDefault();

        return emp;
    }
}

编辑: 下面接受的答案和评论(所有上调)的组合帮助我解决了这个问题(耶!):

public static Domain.Employee SelectEmployee(int employeeId)
{
    using (var db = new EmployeeEntities())
    {

        Domain.Employee emp = (from e in db.Employees.Include("DaysOff")
                       where e.EmployeeId == employeeId
                       select e).FirstOrDefault();

        return emp;
    }
}

2 个答案:

答案 0 :(得分:10)

  

我认为儿童记录会被填充是错误的吗?

猜测可能是DaysOff懒散地填充,但到那时EmployeeEntities已被处理掉。你可能想尝试类似的东西:

using (var db = new EmployeeEntities().Include("Employee.DaysOff"))

另请注意,using语句中的代码更简单,可以写成:

return db.Employees.FirstOrDefault(e => e.EmployeeId == employeeId);

修改

上面的代码不正确。必须在IncludeObjectQuery<T>上使用IQueryable<T>,且不能将ObjectContext / DbContext应用于using (var db = new EmployeeEntities()) { return db.Employees.Include("DaysOff") .FirstOrDefault(e => e.EmployeeId == employeeId); } / {{1}}。正确用法是:

{{1}}

答案 1 :(得分:4)

这里是关于加载子实体

的帖子

Using DbContext in EF 4.1 Part 6: Loading Related Entities

急切加载相关实体

 // Load all prents and related childs
    var princesses1 = context.Parent
                          .Include(p => p.childs)
                          .ToList();

明确加载相关实体

var parent = context.parent.Find(1);
    context.Entry(parent)
        .Collection(p => p.childs)
        .Load();