EF 4没有加载外键对象

时间:2013-05-12 14:07:11

标签: c# database asp.net-mvc-3 entity-framework

我正在运行ASP.NET MVC 3应用程序(C#)。

我最近在我的数据库中创建了一个可以为空的密钥。这可能不是最佳实践,但是对于我的场景是必要的。所以现在当我显示我的报告(ASPX View Engine)时,我在数据库中可以为空的对象的值将不会显示。

现在(简化)的数据结构如下:

Inventory
________________
InventoryID int PK
ShopID FK int NOT NULL
ProductID FK int NULL

唯一的变化是ProductID曾经是不可为空的。

我的ActionResult如下:

[HttpPost]
public ActionResult InventoryReport(FormCollection formVariables, InventoryReportRequest reportRequest)
        {
            ModelContainer ctn = new ModelContainer();

            var query = ctn.Inventory.Where(ic => !ic.Deleted && ic.ShopID == reportRequest.ShopID);

            if (reportRequest.ProductID.HasValue)
            {
                query = (from ic in query
                         where reportRequest.ProductID == ic.ProductID
                         select ic);
            }

            List<Inventory> checks = query.ToList();

            if (checks.Count > 0)
            {
                return View(checks);
            }
            else
            {
                return RedirectToAction("Index");
            }
        }

当我通过此Action调试时,我可以看到正在检索ProductID,但Product对象仍为null。所以当我想在我的视图中显示我的结果时 -

<table class="normal" width="100%">
        <tr>
            <th>
                Date
            </th>
            <th>
                Shop
            </th>
            <th>
                **Product Name**
            </th>
            <th>
                **Product ID**
            </th>
            <th>
                Active
            </th>
        </tr>

    <% foreach (var item in Model) { %>
        <tr>
            <td>
                <%: Html.DisplayFor(modelItem => item.DateChecked) %>
            </td>
            <td>
                <%: Html.DisplayFor(modelItem => item.Shop.Name) %>
            </td>
            <td>
                **<%: Html.DisplayFor(modelItem => item.Product.Name) %>**
            </td>
            <td>
                **<%: Html.DisplayFor(modelItem => item.Product.ProductID) %>**
            </td>
            <td>
                <%: Html.DisplayFor(modelItem => item.Active) %>
            </td>
        </tr>
    <% } %> 

    </table>

已加星标的项目显示为空白。

对于解决此问题我需要做什么提供建议吗?如果需要更多信息,请询问:)

1 个答案:

答案 0 :(得分:2)

实际上,如果您未对查询进行任何更改,则先前加载Product会更令人惊讶。要加载Product,您必须使用Include,而不管FK是否可以为空?

ctn.Inventory.Include("Product").Where(...

无论如何,现在添加Include,你会没事的。