MVC5+EF 多个Model呈现在一个View里的有关问题
MVC5+EF 多个Model呈现在一个View里的问题
如题,具体问题如下: 用Code-First现分别有2个Mode: ItemInfo和ItemTime
接着在EFDbContext里分别写了DbContext代码:
然后弄了一个ViewModel:
接着在Controller里进行处理:
最后View:
但是总是出现问题:说DbContext 已经释放了,查了下具体原因是因为Controller里对应的LINQ代码是有延迟后置的,实际是没有操作过,但是具体解决办法并不知道,求大神帮忙贴出代码解决,万分感谢!
并且,小弟我想拜精通MVC5和EF的大神为师傅,当然不会亏待师傅了,徒弟我必交学费,而且徒弟我学习能力强,自学.net 3个月,MVC5接触1个月,希望能有大神师傅能在旁点拨,您教出来的徒弟一定不会让您失望的,谢谢!
------解决思路----------------------
Controller 里本来就是用来进行 First、Take、Where 之类运算的地方。View本来就不应该再写任何计算代码。应该在Controller就产生完毕所有需要绑定到View的数据实例,而不是到View才去开始查询。
------解决思路----------------------
解决办法如3楼和4楼所说,你需要用ToList把数据从数据库中取出保存在内存中,不加ToList()的话,在你调用数据时它才试图连接数据库获取数据,而这时DbContext已释放,相应的数据库连接已经关闭了,无法执行数据库操作,所以会出现这样的错误
------解决思路----------------------
还有一个解决方法,你把DbContext的实例作为Controller类的一个字段,另外你的ViewModel中最好使用IEnumerable<T>来表示对象集合
如题,具体问题如下: 用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个月,希望能有大神师傅能在旁点拨,您教出来的徒弟一定不会让您失望的,谢谢!
------解决思路----------------------
Controller 里本来就是用来进行 First、Take、Where 之类运算的地方。View本来就不应该再写任何计算代码。应该在Controller就产生完毕所有需要绑定到View的数据实例,而不是到View才去开始查询。
------解决思路----------------------
解决办法如3楼和4楼所说,你需要用ToList把数据从数据库中取出保存在内存中,不加ToList()的话,在你调用数据时它才试图连接数据库获取数据,而这时DbContext已释放,相应的数据库连接已经关闭了,无法执行数据库操作,所以会出现这样的错误
------解决思路----------------------
还有一个解决方法,你把DbContext的实例作为Controller类的一个字段,另外你的ViewModel中最好使用IEnumerable<T>来表示对象集合