2014-08-27 44 views
0

这原本张贴在这里:
How to check if a lazy loading propery returns null ..但没有得到回答,可能是由于问题不是足够清晰的支持代码。 (我想删除它,但我不知道这是否会对我的张贴能力的后果)如何检查是否有延迟加载属性格式返回null(重新)

我认为这个问题具有价值,所以我重新它清晰:

下面的代码:

var itinerary = context.Itineraries 
.Include(i => i.ItineraryDays.Select(id => id.Listing.Port.Country)) 
.Include(i => i.ItineraryStartDates) 
.Where(i => i.Id == Id).FirstOrDefault(); 

将数据传送给视图,其抛出异常“未设置为一个对象的实例对象引用”,在下面的代码**:

@foreach (var d in Model.ItineraryDays) 
    { 
     <tr> 
      <td> 
       @Html.DisplayFor(model => d.DayPlus1) 
      </td> 
      <td> 
       @Html.ActionLink(d.Listing.Name, "Details", "Port", new { Id = d.ListingId }, null) 
      </td> 
      <td> 
       @if (d.Listing != null) ** 
        { 
         // 
        } 

一些POIN TS:

  • d.Listing总是有一个值,永远不能为null
  • d.Listing.Port可以返回一个空
  • 异常,只有当d.Listing.Port为空时

谁能告诉我为什么抛出异常吗?

UPDATE 刚刚发现,我的代码确实,在某些情况下,处理空值未抛出异常,但不是在所有情况下。例如1)良好2)异常

1) @Html.DisplayFor(model => d.Listing.Port.Country.Name) 
2) @Html.ActionLink(d.Listing.Port.Country.Name, "Details", "Country", new { Id = d.Listing.Port.Country.Id }, null) 

问候,盖伊

+0

这可能是'D'是空。显示更多代码,以便我们看到'd'。 – haim770 2014-08-27 08:57:02

+0

你不应该创建一个重复的问题,你应该做的是改善这个问题,它会转到首页,请阅读[帮助中心](http://stackoverflow.com/help/no-one-answers) – 2014-08-27 09:00:10

+0

@Yuliam。我不确定如何去解决这个问题,因为原来的帖子留下了评论。重新配置的职位明显不同,这意味着这些职位不会与变化挂钩,并造成混乱。将来我会尝试改进和重新发布,以最大限度地减少这种“断开连接”。 – 2014-08-27 11:45:25

回答

0

假设你的先例后,对我来说一个可能的解决方案是:

.Include(i => i.ItineraryDays.Select(id => id.Listing.Port.Country)) 

本应该命中的数据库后进行评估,并且,由于Post为null,因此Port.Country会抛出。

来验证这个想法:

  • 检查所发出的SQL,和/或
  • .Include(i => i.ItineraryDays.Select(id => id.Listing.Port != null ?id.Listing.Port.Country : null))
+0

...使用您的代码我得到>包含路径表达式必须引用该类型上定义的导航属性。使用虚线路径作为参考导航属性,使用Select运算符作为集合导航属性.... – 2014-08-27 11:31:35

+0

@ haim770。 d绝对不是空的。 (我设置了一个中断点来检查这个异常情况)。 – 2014-08-27 11:49:10