【问题标题】:MVC4 Stored Procedure returns results, but MVC shows the lookup field values are nullMVC4 存储过程返回结果,但 MVC 显示查找字段值为空
【发布时间】:2013-04-09 15:38:33
【问题描述】:

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

我有一个视图,其中 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 中,当我将鼠标悬停在“结果”上时,AdvisoryCategoryID 已填写,但 AdvisoryCategory 为空。与其他两个查找相同。我认为这是因为 AdvisoryCategoryID 在我的 Advisory 模型中,但 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 返回的数据?谢谢。

【问题讨论】:

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


    【解决方案1】:

    我认为这是关于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

    【讨论】:

      【解决方案2】:

      我找到了解决方案: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();
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-03
        • 1970-01-01
        • 1970-01-01
        • 2012-12-22
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多