8

我使用实体框架来创建我的数据库模式并生成我的代码。我有一个名为 Employee 的表,它在 DaysOff 表中有子记录。DaysOff 对 Employee 有一个外键,并且在我的模型中有一个 1 到 * 的关联。我在 Employee 表上运行了一个 LINQ 查询,并期望我的 Domain.Employee 对象将填充 DaysOff 但 DaysOff 为空。当我深入研究对象时,我看到“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;
    }
}
4

2 回答 2

11

我认为将填充子记录是错误的吗?

这可能DaysOff是懒惰地填充,但到那时EmployeeEntities已经被处理掉了。您可能想尝试以下方法:

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

另请注意,您在using语句中的代码会更简单地写成:

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

编辑

上面的代码不正确。Include必须用在ObjectQuery<T>or上IQueryable<T>,不能用在ObjectContext/DbContext上。正确用法是:

using (var db = new EmployeeEntities())
{
    return db.Employees.Include("DaysOff")
        .FirstOrDefault(e => e.EmployeeId == employeeId);
}
于 2012-07-20T15:38:41.747 回答
4

这是关于加载子实体的帖子

在 EF 4.1 第 6 部分中使用 DbContext:加载相关实体

急切加载相关实体

 // 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();
于 2012-07-20T15:40:55.443 回答