视图中的 MVC4 模型问题:在调试模式下模型缺少详细信息
Posted
技术标签:
【中文标题】视图中的 MVC4 模型问题:在调试模式下模型缺少详细信息【英文标题】:MVC4 Model in View issue: in debug mode Model is missing details 【发布时间】:2012-10-28 19:04:56 【问题描述】:我遇到了一个非常奇怪(也很烦人)的问题: 在 MVC 4 Web 应用程序中,同时从数据库加载数据并在视图中的模型上使用 foreach:
@foreach (var meeting in Model)
我在方法的开头有一个断点,检查对象会议我发现它丢失了一些数据(引用其他表)。如果我在会议中打开 (+) 其他对象,则会出现丢失的数据。
为什么?
谢谢!
这是我的控制器方法:
public ActionResult GetMeetingMR(int id = 0)
var meetingPurpose = db.MeetingPurposes.ToList();
ViewBag.MeetingPurpose = new SelectList(meetingPurpose, "MeetingPurposeID", "MeetingPurposeName");
ViewBag.MRID = id;
List<Meeting> meetings = (db.MortgageRequests.Find(id)).Meetings.ToList();
return View(meetings);
【问题讨论】:
您的问题与 MVC4 无关,而与您如何使用 EF 从数据库加载数据有关。您所体验的是 Entity-Framework 中延迟加载的效果。因此,请发布您的数据加载代码,让我们为您提供帮助。 嗨@nemesv 我刚刚用我的控制器中的代码编辑了这个问题。谢谢。 【参考方案1】:在您的问题中包含您的标题,我猜您在没有附加调试器的情况下(还)没有遇到问题。
正如其他人评论的那样,这是由于LazyLoading
。
有时可能会出现此问题,因为在渲染 View
时,实体容器正在被释放,很可能是因为它是由调用容器的析构函数的 GarbageCollector 收集的。
如果您希望访问 View
上的实体,可以在 ObjectSet
上使用 Include
。
假设MeetingPurposes
有一个关联的EntitySet
Dates
:
如果您希望将它们包含在加载操作中,您可以执行以下操作:
db.MeetingPurposes.Include("Dates").ToList();
public ActionResult GetMeetingMR(int id = 0)
//Load the MeetingPurposes including their dates
var meetingPurpose = db.MeetingPurposes.Include("Dates").ToList();
ViewBag.MeetingPurpose = new SelectList(meetingPurpose,
"MeetingPurposeID",
"MeetingPurposeName");
ViewBag.MRID = id;
List<Meeting> meetings = (db.MortgageRequests.Find(id)).Meetings.ToList();
return View(meetings);
如果您希望为 Meetings
执行此操作,并且 Meetings 有一个 EntitySet
或 Dates
,您可以这样做:
public ActionResult GetMeetingMR(int id = 0)
var meetingPurpose = db.MeetingPurposes.ToList();
ViewBag.MeetingPurpose = new SelectList(meetingPurpose,
"MeetingPurposeID",
"MeetingPurposeName");
ViewBag.MRID = id;
var meetings = (from mee in db.Meetings.Include("Dates")
join mga in dbo.MortgageRequests.Where(m => m.Id == id)
on mee.MortgageRequestID equals mga.ID
select mee).ToList();
return View(meetings);
不太确定你的Find
扩展方法是什么,所以我在MortgageRequests
上使用了Where
。
【讨论】:
嗨@Silvermind,谢谢你的回答。到目前为止,我已经尝试了这些选项:db.Meetings.Include(m => m.MortgageRequest.Meetings).Where(m => m.MortgageRequest.MortgageRequestID == id).ToList()
和:db.MortgageRequests.Include(m => m.Meetings).Where(m => m.MortgageRequestID == id).First().Meetings.ToList();
我仍然没有得到对象中的数据。在您的第二个示例中,您是否创建另一个 DBContext dbo?
@Shlo 您要访问的导航属性的名称是什么?我不是在创建 DbContext,我假设您已经拥有一个。
我尝试访问两个导航属性:SetToUser 和 SetByUser。这些属性是对 UserProfile 的引用。我确实有一个 dbContext。谢谢。
我将查询更改为:db.Meetings.Include(m => m.SetByUser).Where(m => m.MortgageRequest.MortgageRequestID == id).ToList();
,它可以工作。我认为是因为我在查询中包含了导航属性?以上是关于视图中的 MVC4 模型问题:在调试模式下模型缺少详细信息的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC4 视图中的模型和 ItemModel 绑定