我有一个示例应用,它的模型和上下文如下-。
public class Department
{
public int Id { get; set; }
public string Name { get; set;}
public virtual ICollection<Student> Students { get; set; }
}
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Department Department { get; set; }
}
public class TestContext : DbContext
{
public DbSet<Student> Students { get; set; }
public DbSet<Department> Departments { get; set; }
}
下面是progarm.cs的代码。当我调试时,调试器到达foreach块内的Consol.WriteLine方法时,我得到错误信息----------。 已经有一个与该命令相关联的开放的DataReader,必须先将其关闭。. 为什么会这样。当到达foreach代码时,打开连接后,上下文不应该自动关闭。
class Program
{
static void Main(string[] args)
{
using (var context = new TestContext())
{
var students = context.Students.Where(s => s.Id == 1);
foreach (var student in students)
{
Console.WriteLine("Student : {0} - Department {1}", student.Name, student.Department.Name);
}
Console.ReadLine();
}
}
这个问题的提出是由于这个在foreach循环中。student.Department.Name
.
事实上,这里你有一个与foreach循环相关的DataReader和一个与加载相关的DataReader。Department
这样改变检索方式,你的问题应该就解决了。
var students = context.Students.Where(s => s.Id == 1).Include(s => s.Department).ToList();