实体框架运行时错误--已经有一个开放的DataReader与该命令相关联,必须先将其关闭。

问题描述 投票:0回答:1

我有一个示例应用,它的模型和上下文如下-。

   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(); 
        }
    }
entity-framework entity-framework-6 dbcontext
1个回答
1
投票

这个问题的提出是由于这个在foreach循环中。student.Department.Name.

事实上,这里你有一个与foreach循环相关的DataReader和一个与加载相关的DataReader。Department

这样改变检索方式,你的问题应该就解决了。

var students = context.Students.Where(s => s.Id == 1).Include(s => s.Department).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.