我有一个方法可以返回一份员工清单。
public Employee GetAdminTypeAndPermission(int userID)
{
using (var unitOfWork = new EFUnitOfWork())
{
var employeeRepo =
new EmployeeRepository(new EFRepository<Employee>(), unitOfWork);
DbSet<Employee> employeeObjSet =
((EmployeeEntities)employeeRepo.Repository.UnitOfWork.Context).Employees;
return employeeObjSet.Where(emp => emp.FK_UserID == userID).
Include("AdminType.Permissions").FirstOrDefault();
}
}
我试图使用的另一种方法,
var employee= GetAdminTypeAndPermission(loginInfo.UserID);
var permission = employee.AdminType.Permissions.FirstOrDefault();
我在以下行收到错误:
var permission = employee.AdminType.Permissions.FirstOrDefault();
ObjectContext实例已被释放,无法再使用 对于需要连接的操作。 我理解在使用块结束后Context对象处理,但是我使用Eager加载来访问Navigation属性,我应该得到结果集。
请帮助我理解我在这里犯的错误以及我应该如何纠正。
非常感谢任何帮助。 提前谢谢。
答案 0 :(得分:2)
您在使用声明中有DbContext:
using (var unitOfWork = new EFUnitOfWork())
一旦您退出此using语句,您与数据库的连接将被有效关闭。要么:
将DbContext传递给方法,以便继续使用它:
using (var unitOfWork = new EFUnitOfWork())
{
var employee= GetAdminTypeAndPermission(loginInfo.UserID, unitOfWork); //DbContext passed in
var permission = employee.AdminType.Permissions.FirstOrDefault();
}
答案 1 :(得分:0)
好吧,也许你的相关表名错了?我的意思是,字符串类型的东西很难在你的代码中控制,也就是说(可能没有最后的&#39;?)
return employeeObjSet.Where(emp => emp.FK_UserID == userID).
Include("AdminType.Permission").FirstOrDefault();
对于这种错误,我建议你使用lambda扩展属性名称解析器,即Include方法的重载/扩展,如果你输入以下using指令将包括它:
using System.Data.Entity;
这是我倾向于使用的扩展程序:
public static IQueryable<T> Include<T, TProperty>(this IQueryable<T> source, Expression<Func<T, TProperty>> path);
它的使用方式如下:
return employeeObjSet.Where(emp => emp.FK_UserID == userID).
Include(x => x.Permissions).FirstOrDefault();
这里是x.Permission s ,因为你使用的ef生成器或cf编码标准的ICollection复数化。
希望它有所帮助。