0

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

我最近在我的数据库中设置了一个可以为空的外键。这可能不是最佳实践,但它对我的场景是必要的。所以现在当我显示我的报告(ASPX 视图引擎)时,我在我的数据库中设置为空的对象的值将不会显示。

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

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");
            }
        }

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

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

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

任何人都可以就我需要做些什么来解决这个问题提供建议吗?如果需要更多信息,请询问:)

4

1 回答 1

4

实际上,Product如果您没有对查询进行任何更改,那么之前加载的内容会更令人惊讶。要Product加载,您必须使用Include,无论 FK 是否可以为空

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

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

于 2013-05-12T15:06:43.737 回答