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

时间:2013-05-06 11:44:49

标签: c# linq entity-framework-4

我有一段代码需要根据来自数据库的数据返回一个分隔的字符串,除了提到注释的行之外,所有代码都运行正常。 我知道单个DbContext在单个实例时不能用于多个QUERIES。

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,“部门”是另一个表,因此是“员工”的外键...... 如果我不清楚,请告诉我。

现在任何帮助都会像为我赢得两个世界:)

1 个答案:

答案 0 :(得分:3)

第一个解决方法:

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

这将关闭与student表的连接,但会向延迟加载部门生成其他查询。

另一种选择:

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

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