MVC5+EF 多个Model呈现在一个View里的有关问题

MVC5+EF 多个Model呈现在一个View里的问题
如题,具体问题如下:  用Code-First现分别有2个Mode: ItemInfo和ItemTime 

 public class ItemInfo
    {
        public ItemInfo()
        {
            this.ItemTimes = new HashSet<ItemTime>();
            this.Comments = new HashSet<Comment>(); 
        }
        [Key]
        [HiddenInput(DisplayValue = false)]
        public int ItemId { get; set; }

        public string ItemCnName { get; set; }

        public string ItemEnName { get; set; }

        public string ItemDescription { get; set; }
        public virtual ICollection<ItemTime> ItemTimes { get; set; }
        public virtual ICollection<Comment> Comments { get; set; } 

    }


 public class ItemTime
    {
        public ItemTime()
        {
            UserItemTimes = new HashSet<UserItemTime>();
        }
        [Key]
        public int ItemTimeId { get; set; }
        public DateTime Time { get; set; }
        public int ItemId { get; set; }

        public virtual ItemInfo ItemInfo { get; set; }
        public virtual ICollection<UserItemTime> UserItemTimes { get; set; }
    }


接着在EFDbContext里分别写了DbContext代码:

 public class EFDbContext : DbContext
    {
        public EFDbContext() : base("EFDbContext")
        {
            Database.SetInitializer<EFDbContext>(null);
        }
       
        public DbSet<ItemInfo> ItemInfoes { get; set; }
        public DbSet<ItemTime> ItemTimes { get; set; }
      
    }

然后弄了一个ViewModel:

 public class ItemUserViewModel
    {
     
        public ItemInfo ItemInfo { get; set; }
        public IQueryable<ItemTime> ItemTime { get; set; }
       
    }

接着在Controller里进行处理:

 public ActionResult Test()
        {
            using (var context = new EFDbContext())
            {
                var itemuser = new ItemUserViewModel
                {
                    ItemInfo = context.ItemInfoes.FirstOrDefault(a => a.ItemId == 1),
                    ItemTime = context.ItemTimes
                                      .Where(a => a.ItemInfo.ItemId == 1)
                                      .TakeWhile(a => a.Time > System.DateTime.Now)
                };
               
                return View(itemuser);
            }
            
        } 

最后View:

@model WebConan.Models.ItemUserViewModel
           
<p>@Model.ItemInfo.ItemCnName</p>


@foreach (var p in Model.ItemTime)
{
    <p>@p.Time</p>
}


但是总是出现问题:说DbContext 已经释放了,查了下具体原因是因为Controller里对应的LINQ代码是有延迟后置的,实际是没有操作过,但是具体解决办法并不知道,求大神帮忙贴出代码解决,万分感谢!  
并且,小弟我想拜精通MVC5和EF的大神为师傅,当然不会亏待师傅了,徒弟我必交学费,而且徒弟我学习能力强,自学.net 3个月,MVC5接触1个月,希望能有大神师傅能在旁点拨,您教出来的徒弟一定不会让您失望的,谢谢!
------解决思路----------------------
引用:
Quote: 引用:

MVC5+EF 多个Model呈现在一个View里的有关问题 简单保留 toList()


具体方法我已经自己测试出来了。。。  主要是ViewModel里,应该都是IEnumerable<Item> 然后在Controller里,不应该带First和TakeWhile, 只能在View层里进行选取


Controller 里本来就是用来进行 First、Take、Where 之类运算的地方。View本来就不应该再写任何计算代码。应该在Controller就产生完毕所有需要绑定到View的数据实例,而不是到View才去开始查询。
------解决思路----------------------
解决办法如3楼和4楼所说,你需要用ToList把数据从数据库中取出保存在内存中,不加ToList()的话,在你调用数据时它才试图连接数据库获取数据,而这时DbContext已释放,相应的数据库连接已经关闭了,无法执行数据库操作,所以会出现这样的错误
------解决思路----------------------
还有一个解决方法,你把DbContext的实例作为Controller类的一个字段,另外你的ViewModel中最好使用IEnumerable<T>来表示对象集合