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

90smydream 2015-01-05 08:19:02
如题,具体问题如下: 用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个月,希望能有大神师傅能在旁点拨,您教出来的徒弟一定不会让您失望的,谢谢!
...全文
707 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
90smydream 2015-02-01
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
[quote=引用 5 楼 likeconan123 的回复:] [quote=引用 3 楼 lc8882972 的回复:] 简单保留 toList()
具体方法我已经自己测试出来了。。。 主要是ViewModel里,应该都是IEnumerable<Item> 然后在Controller里,不应该带First和TakeWhile, 只能在View层里进行选取[/quote] Controller 里本来就是用来进行 First、Take、Where 之类运算的地方。View本来就不应该再写任何计算代码。应该在Controller就产生完毕所有需要绑定到View的数据实例,而不是到View才去开始查询。[/quote] 突然感觉您说的特别有道理啊,那这样子看来我的代码要全部修改了啊。。。
lincolnandlinda 2015-01-21
  • 打赏
  • 举报
回复
还有一个解决方法,你把DbContext的实例作为Controller类的一个字段,另外你的ViewModel中最好使用IEnumerable<T>来表示对象集合
webdiyer 2015-01-21
  • 打赏
  • 举报
回复
解决办法如3楼和4楼所说,你需要用ToList把数据从数据库中取出保存在内存中,不加ToList()的话,在你调用数据时它才试图连接数据库获取数据,而这时DbContext已释放,相应的数据库连接已经关闭了,无法执行数据库操作,所以会出现这样的错误
一枚大帅哥 2015-01-21
  • 打赏
  • 举报
回复
引用 8 楼 webdiyer 的回复:
解决办法如3楼和4楼所说,你需要用ToList把数据从数据库中取出保存在内存中,不加ToList()的话,在你调用数据时它才试图连接数据库获取数据,而这时DbContext已释放,相应的数据库连接已经关闭了,无法执行数据库操作,所以会出现这样的错误
UP
  • 打赏
  • 举报
回复
引用 5 楼 likeconan123 的回复:
[quote=引用 3 楼 lc8882972 的回复:] 简单保留 toList()
具体方法我已经自己测试出来了。。。 主要是ViewModel里,应该都是IEnumerable<Item> 然后在Controller里,不应该带First和TakeWhile, 只能在View层里进行选取[/quote] Controller 里本来就是用来进行 First、Take、Where 之类运算的地方。View本来就不应该再写任何计算代码。应该在Controller就产生完毕所有需要绑定到View的数据实例,而不是到View才去开始查询。
  • 打赏
  • 举报
回复
跨程序层不要使用 IQueryable<ItemTime>,应该声明为 ItemTime[] 或者 List<ItemTime>。 实际上,如果你制定跨平台的基本接口,你连 List<T> 都不应该滥用,而应该使用通用的 T[]类型,这样才能保证可靠性。 不是什么程序都以“省事儿”为原则的,要了解不能做什么,否则就应该使用规范的做法。
90smydream 2015-01-19
  • 打赏
  • 举报
回复
引用 3 楼 lc8882972 的回复:
简单保留 toList()
具体方法我已经自己测试出来了。。。 主要是ViewModel里,应该都是IEnumerable<Item> 然后在Controller里,不应该带First和TakeWhile, 只能在View层里进行选取
LcGyAn 2015-01-11
  • 打赏
  • 举报
回复
context.ItemTimes .Where(a => a.ItemInfo.ItemId == 1) .TakeWhile(a => a.Time > System.DateTime.Now).toList();
LcGyAn 2015-01-11
  • 打赏
  • 举报
回复
简单保留 toList()
sinat_20919149 2015-01-10
  • 打赏
  • 举报
回复
可以存放到ViewData[Name] 页面用 ViewData[name] as 你的类别 来获取
90smydream 2015-01-05
  • 打赏
  • 举报
回复


这个为报错图,忘记上传了

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧