2013-04-09 78 views
1

我的過程返回所有結果,但MVC顯示查找爲空。MVC4存儲過程返回結果,但MVC顯示查找字段值爲空

我有一個觀點,其中「網格」的循環是這樣的:

@foreach (var item in Model) { 
    <tr> 
     <td>@Html.ActionLink(item.Headline, "ViewDetails", "Advisory", new { id=item.AdvisoryId }, "")</td> 
     <td>@item.AdvisoryStartDate.ToShortDateString()</td> 
     <td>@item.AdvisoryType.AdvisoryType</td> 
     <td>@item.AdvisoryProvider.AdvisoryProvider</td> 
     <td>@item.AdvisoryCategory.AdvisoryCategory</td>   
    </tr> 
} 

最後三個字段是查找。我最初填充此與此控制器電話:

var advisories = db.Advisories.Include(i => i.AdvisoryType) 
      .Include(i => i.AdvisoryProvider) 
      .Include(i => i.AdvisoryCategory) 
      .OrderByDescending(i => i.AdvisoryStartDate); 
     ViewData["Advisories"] = advisories; 

但現在我已經取代了這個調用proc(因爲我需要獲得「公告」的用戶還沒有見過的,所以它不是更復雜以上,這基本上是「讓所有」;我還需要通過用戶名查詢數據庫,而MVC只有User.Identity.Name):

var results = db.Database.SqlQuery<Advisory>("EXEC [ponzi].[uspUserAdvisories] {0}", User.Identity.Name).ToList(); 
ViewData["Advisories"] = results; 

我知道PROC返回所有結果(當我運行SQL Server),但在MVC中,當我將鼠標懸停在「結果」上時,AdvisoryCategoryID被填充,但AdvisoryCategory爲空。與其他兩個查找一樣。我認爲這是因爲AdvisoryCategoryID在我的諮詢模型中,但AdvisoryCategory來自AdvisoryCategory模型。

下面是諮詢模型的相關部分:

[Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int AdvisoryId { get; set; } 

    public virtual int AdvisoryTypeID { get; set; } 
    public virtual AdvisoryTypes AdvisoryType { get; set; } 

    public virtual AdvisoryProviders AdvisoryProvider { get; set; } 
    public virtual int AdvisoryProviderID { get; set; } 

    public virtual AdvisoryCategories AdvisoryCategory { get; set; } 
    public virtual int AdvisoryCategoryID { get; set; } 

我怎樣才能得到這三個查找字段顯示由PROC返回的數據?謝謝。

回答

0

我找到了一個解決方案:的ViewModels。(來代替我的忠告模型)這裏的新AdvisoriesViewModel的相關部分:

public int AdvisoryTypeID { get; set; } 
    public string AdvisoryType { get; set; } 

    public string AdvisoryProvider { get; set; } 
    public int AdvisoryProviderID { get; set; } 

    public string AdvisoryCategory { get; set; } 
    public int AdvisoryCategoryID { get; set; } 

現在,我打電話給我的PROC這一行,已經取代了「諮詢」與「AdvisoryViewModel」:

var advisories = db.Database.SqlQuery<AdvisoryViewModel>("EXEC [ponzi].[uspUserAdvisories] {0}", User.Identity.Name).ToList(); 

由於返回的數據集具有相同字段的模型,並且不依賴於另一個模型,它可以工作。

0

我認爲這是對eager loading of navigation propertiesAdvisoryCategory等),如果我理解你正在試圖做正確的...

如果你試圖加載navigation properties - 從您的SQL查詢,SP - 我不認爲這會奏效。這就是上面的正常linq語句的Include部分 - 並且生成一個更復雜的SQL來加入其他表的屬性等等。它會使 更復雜。

這不適用於代碼優先,即使它需要特殊的「技術」才能使其匹配。

在這裏看到這個鏈接,確認Eager Load from Entity Framework SP

您可以嘗試在默認情況下(虛擬等),將它設置爲lazy loading - 並希望它會在第一次訪問加載。也嘗試不同的loading methods

或者只是明確地按需加載類 - 見this linkExplicitly Loading


Eager Load from Entity Framework SP
http://msdn.microsoft.com/en-US/data/jj574232
Eager loading in EntityFramework with DbContext.Database.SqlQuery