渴望加载不在EF 6中工作

时间:2014-12-12 16:28:21

标签: 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);

        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属性,我应该得到结果集。

请帮助我理解我在这里犯的错误以及我应该如何纠正。

非常感谢任何帮助。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

您在使用声明中有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();
    }
    

答案 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复数化。

希望它有所帮助。