2012-10-28 41 views
1

我遇到了一個非常奇怪的(和惱人的)問題: 在MVC 4 web應用程序,同時從數據庫中加載數據和在視圖中使用模型的foreach:MVC4模型在查看問題:在調試模式模型是缺少細節

@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); 

    } 
+2

您的問題與MVC4無關,但與您如何使用EF從數據庫加載數據無關。你遇到的是實體框架中延遲加載的效果。所以請發佈您的數據加載代碼,讓我們來幫助您。 – nemesv

+0

嗨@nemesv我剛剛用我的控制器中的代碼編輯了問題。謝謝。 – Shlo

回答

0

包括在你的問題你的標題,我的猜測是,你不要不附加調試器遇到問題(還)。
正如其他人已評論它是由於LazyLoading
有時候可能會出現此問題,因爲在處理實體容器時正在渲染View,這很可能是因爲它由調用容器的析構函數的GarbageCollector收集。

如果您想訪問View上的實體,請使用ObjectSet上的Include。 假設MeetingPurposes都有相關的DatesEntitySet: 如果你希望包括他們在loadoperation您可以執行以下操作:如果您希望爲Meetings和會議爲此 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); 
} 

具有的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擴展方法是什麼,所以我用了一個WhereMortgageRequests

+0

嗨@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

+0

@Shlo您想要訪問的導航屬性的名稱是什麼?我沒有創建一個DbContext,我假設你已經有一個。 – Silvermind

+0

我嘗試訪問兩個導航屬性:SetToUser和SetByUser。這些屬性是對UserProfile的引用。我有一個dbContext。謝謝。 – Shlo