C# 紧急加载在EF 6中不起作用
我有一个方法可以返回一个员工列表C# 紧急加载在EF 6中不起作用,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,我有一个方法可以返回一个员工列表 public Employee GetAdminTypeAndPermission(int userID) { using (var unitOfWork = new EFUnitOfWork()) { var employeeRepo = new EmployeeRepository(new EFRepository<Employee>(), unitOfWork); DbS
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 permission = employee.AdminType.Permissions.FirstOrDefault();
ObjectContext实例已被释放,无法再使用
用于需要连接的操作。
我知道上下文对象在使用块结束后会被处理,但我正在使用渴望加载来访问导航属性,我应该得到结果集
请帮助我理解我在这里犯了什么错误以及我应该如何纠正
非常感谢您的帮助。
提前感谢。在using语句中有DbContext:
using (var unitOfWork = new EFUnitOfWork())
一旦您退出这个using语句,您与数据库的连接就有效地关闭了。要么:
- 在函数内部(以及using语句内部)或
- 将DbContext传递给该方法,以便继续使用它:
using (var unitOfWork = new EFUnitOfWork()) { var employee= GetAdminTypeAndPermission(loginInfo.UserID, unitOfWork); //DbContext passed in var permission = employee.AdminType.Permissions.FirstOrDefault(); }
using System.Data.Entity;
这是我倾向于使用的扩展:
public static IQueryable<T> Include<T, TProperty>(this IQueryable<T> source, Expression<Func<T, TProperty>> path);
这里的x.Permissions是因为ef生成器的ICollection多重化或您使用的cf编码标准
希望有帮助。你能发布
employee.AdminType.Permissions
的内部内容吗。如何在幕后检索权限
?在这种情况下,它可能实际上是employeeRepo(我觉得这个用法有点奇怪),但原因应该是一样的。他正在尝试加载它。是否处置ctx并不重要。如果相关的导航集合/实体是即时加载的,则它不会获得延迟加载引用,也不需要“活动”DbContext。但是你在这里所做的应该解决这个问题,因为你显式地将值保存到一个局部变量中。如果它适合他作为正确的解决方案,那也没关系。同意将DbContext引用传递给以后使用。这是导致急切加载的第一个默认值,仍然需要在上下文中完成。另一种方法可能涉及一个include来在一个查询中提取所有内容,但这只会更加复杂。
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();