2013-05-12 3 views
0

ASP.NET MVC 3 응용 프로그램 (C#)을 실행하고 있습니다.EF 4에서 외래 키 객체를로드하지 않습니다.

최근 데이터베이스에서 null 허용 가능 외래 키를 만들었습니다. 이것은 아마도 모범 사례는 아니지만 내 시나리오에서는 필요합니다. 그래서 지금 내 보고서 (ASPX View Engine)를 표시하면 db에 nullable로 만든 객체의 값이 표시되지 않습니다. 다음

지금 (단순화 된) 데이터 구조는 다음

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

이 유일한 변화는 제품 ID는 Null을 허용하지로 사용한다는 것이다. 다음과 같이

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

나는이 작업 불구하고 디버깅 할 때, 나는 제품 ID가 검색되는 것을 볼 수 있지만 제품 객체가 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> 

별표 표시된 항목은 공백으로 표시됩니다.

이 문제를 해결하기 위해 필요한 조치에 대해 조언을 제공 할 수 있습니까? 더 많은 정보가 필요하면 그냥 물어보십시오 :

+0

이 'var query = ctn.Inventory..Include ("Shops")를 시도하십시오. (ic =>! ic.Deleted && ic.ShopID == reportRequest.ShopID);'적절한 변경 사항을 쿼리에 추가합니다 DB에. – Saravanan

+0

@ saravanan 답장을 보내 주셔서 감사합니다. 나는 그 결과를 아무리 시도해 보았습니다. S – 109221793

+0

Gert Arnold가 지적했듯이 컨텍스트에서 제품을 포함 시켰습니까? 코드를 디버그하고 적절한 연결에서 값을 얻었습니까? – Saravanan

답변

2

실제로 쿼리를 변경하지 않았다면 Product이 이전에로드 된 것이 놀랍습니다. Product가로드되기 위해서는 당신이 상관없이 FK의 어쨌든

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

를 널 (NULL) 인 여부, Include를 사용해야 할 것, 지금 Include를 추가하고 당신은 괜찮을거야.

+0

안녕 Gert! 답장을 보내 주셔서 감사합니다. 위와 같이 쿼리를 수정했지만 여전히 운이 좋지 않습니다. 이전에는 이상한 'Includes'를 사용할 필요가 없었으며 Shop 외래 키에 'Includes'를 사용하지 않았지만 모든 Shop 속성은 여전히로드되었습니다. – 109221793

+0

이상한 ...'ModelContainer'는 컨텍스트이고'Inventory'는 DbSet (또는 ObjectSet)이 아닌 것으로 가정합니다. –