我开始使用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,必须先关闭它。
我在这里不理解什么?
由于
答案 0 :(得分:1)
您不理解的是,您有两个foreach语句,每个语句都尝试从同一个数据读取器执行查询。问题是你已经有了第一个foreach的开放数据阅读。
有两种方法可以解决这个问题。您可以通过调用foreach(Post post in be.Posts.ToList())
将查询执行到集合中,例如List,也可以使用MultipleActiveRecordSets = True(也称为MARS支持)定义连接字符串。