实体框架:嵌套相同的上下文表示连接已经打开

本文关键字:连接 表示 上下文 框架 嵌套 实体 | 更新日期: 2023-09-27 18:12:29

我有一段代码,需要根据来自DB的数据返回一个带分隔符的字符串,除了提到注释的行外,所有代码都运行良好。我知道单个DbContext不能在单个实例时间内用于多个查询。

private string FetchNewEmployees(DateTime addedAfter)
    {
        StringBuilder newEmployees = new StringBuilder();
        using (MyDbContext dbContext = new MyDbContext())
        {
            var employees = dbContext.Student.Where(p => p.lastupdatedon > addedAfter);
            foreach (var employee in employees)
            {
                newEmployees.Append(string.Format("{0}|{1}|{2}|{3}|{4}{5}",
                    employee.Name,
                    employee.DOB,
                    employee.department.DepartmentName, // This line throws error saying connection already open | commenting this makes it work like charm
                    employee.EMailAddress,
                    employee.SchoolName,
                    System.Environment.NewLine));
            }
        }
        return newEmployees.ToString();
    }

问题id"department"是另一个表,因此"employee"有一个外键…如果我不清楚的话,请告诉我。

现在任何帮助对我来说都像是赢得了两个世界。

实体框架:嵌套相同的上下文表示连接已经打开

第一个解决方法:

var employees = dbContext.Student.Where(p => p.lastupdatedon > addedAfter).ToList();
...

这将关闭与student表的连接,但将生成额外的查询,以延迟加载部门。

另一种选择:

var employees = dbContext.Student.Include( s => s.department ).Where(p => p.lastupdatedon > addedAfter);
...

这将导致生成一个连接两个表的查询。