编辑:为什么在这个地图中会发生DataReader打开错误?
编辑:为什么在这个地图中会发生DataReader打开错误?
我正在尝试将一个地图传递给视图。在此之前,我使用一些实体(会话、电影、剧院)的数据填充它。我从我的会话中开始进行选择:
var sessions = from s in db.Sessions where s.TheaterID == id orderby s.MovieID, s.Time select s;
这是该方法。在其中,我遍历每个会话,并验证在我的地图中是否有一个以电影名称为键的列表。当执行到这一点时,我收到了臭名昭著的“已经存在与此命令关联的打开的 DataReader,必须首先关闭”的异常。由于类型的原因,我无法将其转换为列表:
public ActionResult MyAction(int id) { Theather theater = db.Theater.Find(id); ViewBag.TheaterName = theater.NomeCinema; var sessions = from s in db.Sessions where s.TheaterID == id orderby s.MovieID, s.Time select s; var mapMovies = new Dictionary>(); foreach (Session s in sessions) { if ( !mapMovies.ContainsKey( s.Movie.MovieName ) ) { mapMovies.Add( s.Movie.MovieName, new List () ); } mapMovies[s.Movie.MovieName].Add(s.Time); } ViewBag.MapMovies = mapMovies; return View(); }
错误发生在这一行:
if ( !mapMovies.ContainsKey( s.Movie.MovieName ) )
我需要做什么来解决这个错误?
在这个地图中为什么会出现“DataReader已打开错误”的问题?
问题的原因是你在使用延迟加载时,当你执行if ( !mapMovies.ContainsKey( s.Movie.MovieName ) )
时,上下文会尝试发出另一个查询来检索电影,但由于你正在进行枚举(其中包含一个打开的DataReader),所以你会收到异常。
解决方法有两种:
1-将查询结果转换为列表,使查询立即执行:
var sessions = (from s in db.Sessions where s.TheaterID == id orderby s.MovieID, s.Time select s).ToList();
2-在查询中包含Movie实体,这样它就会进行贪婪加载而不是延迟加载:
var sessions = from s in db.Sessions.Include(s => s.Movie) where s.TheaterID == id orderby s.MovieID, s.Time select s;