编辑:为什么在这个地图中会发生DataReader打开错误?

10 浏览
0 Comments

编辑:为什么在这个地图中会发生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 ) )

我需要做什么来解决这个错误?

0
0 Comments

在这个地图中为什么会出现“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;

0