MVC4存储过程返回结果,但MVC显示查找字段值为空

时间:2013-04-09 15:38:33

标签: entity-framework stored-procedures asp.net-mvc-4

我的proc返回所有结果,但MVC显示查找为空。

我有一个VIEW,其中“grid”for循环如下所示:

@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调用替换了它(因为我需要获得用户尚未看到的“建议”,所以它比上面更复杂,基本上是“全部”;我还需要通过UserID查询数据库,而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中,当我将鼠标悬停在“results”上时,AdvisoryCategoryID被填入,但AdvisoryCategory为null。与其他两个查找相同。我认为这是因为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返回的数据?感谢。

2 个答案:

答案 0 :(得分:0)

我认为这是关于eager loading of navigation propertiesAdvisoryCategory等),如果我理解你正在尝试做什么......

  

如果您尝试从SQL查询中加载navigation properties - 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

答案 1 :(得分:0)

我找到了一个解决方案:ViewModels。新AdvisoriesViewModel的相关部分(替换我的Advisories模型):

    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,将“Advisory”替换为“AdvisoryViewModel”:

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

由于返回的数据集具有相同字段的模型,并且不依赖于其他模型,因此它可以正常工作。