实体框架打开datareader

时间:2014-07-31 05:18:07

标签: entity-framework entity-framework-6

我开始使用Entity Framewrok并在控制台应用程序中编写以下简单示例代码:

var post1 = new Post
{
            PostTitle = "Post Title 1",
            PostBody = "post Body 1",
            Comments = new List<Comment>
            {
                new Comment{CommentAuthor="aravind",CommentBody="my first comment on post 1"},
                new Comment{CommentAuthor="dimpu",CommentBody="my second Commment on post1"}
            }
};

using (BlogEntites be = new BlogEntites())
{
    foreach(Post post in be.Posts)
    {
        Console.WriteLine(post.PostTitle);

        foreach (Comment comment in post.Comments)
        {
            Console.WriteLine("\t" + comment.CommentBody);
        }
    } 

    be.Posts.Add(post1);   // post1 added in memory
    be.SaveChanges();      // post1 added to DB
}

Console.WriteLine("press any key to continue...");
Console.ReadKey();

起初,我只在帖子上只有foreach并且它有鳍工作,我的所有帖子都有输出。

然后我想为每个帖子添加评论,所以我添加了另一个内部foreach - 如果我正在处理常规对象(我理解ORM应该是什么),我会做什么....

但是在运行此代码时,我会遇到内部异常:

  

已经有一个与此命令关联的打开DataReader,必须先关闭它。

我在这里不理解什么?

由于

1 个答案:

答案 0 :(得分:1)

您不理解的是,您有两个foreach语句,每个语句都尝试从同一个数据读取器执行查询。问题是你已经有了第一个foreach的开放数据阅读。

有两种方法可以解决这个问题。您可以通过调用foreach(Post post in be.Posts.ToList())将查询执行到集合中,例如List,也可以使用MultipleActiveRecordSets = True(也称为MARS支持)定义连接字符串。