我使用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;
}
}
答案 0 :(得分:10)
我认为儿童记录会被填充是错误的吗?
我猜测可能是DaysOff
懒散地填充,但到那时EmployeeEntities
已被处理掉。你可能想尝试类似的东西:
using (var db = new EmployeeEntities().Include("Employee.DaysOff"))
另请注意,using
语句中的代码更简单,可以写成:
return db.Employees.FirstOrDefault(e => e.EmployeeId == employeeId);
修改强>
上面的代码不正确。必须在Include
或ObjectQuery<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();