Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 紧急加载在EF 6中不起作用_C#_Asp.net_Asp.net Mvc_Entity Framework - Fatal编程技术网

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();
    }
    

嗯,可能是您把相关的表名弄错了?我的意思是,在您的代码中,字符串类型的东西很难控制,例如,它是否可能(没有最后一个“s”的许可):

对于此类错误,我建议您使用lambda扩展属性名称解析程序,即如果您输入以下using指令,将包括的Include方法的重载/扩展:

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();