实体框架 - 使用外键获取null异常

问题描述:

在应该是一个非常简单的场景中遇到一些麻烦。例如目的,我有两个表:实体框架 - 使用外键获取null异常

-Users -Comments

有一个一对多的关系,建立了这一点;有一个从Comments.CommentorIDUsers.UserID的外键。当我执行LINQ查询并尝试绑定到DataList时,我得到一个空例外。下面是代码:

FKMModel.FKMEntities ctx = new FKMModel.FKMEntities(); 
     IQueryable<Comment> CommentQuery = 
      from x in ctx.Comment 
      where x.SiteID == 101 
      select x; 
     List<Comment> Comments = CommentQuery.ToList(); 
     dl_MajorComments.DataSource = Comments; 
     dl_MajorComments.DataBind(); 

在ASPX页面,我有以下作为一个ItemTemplate(我简化,并拿出造型等,为在这里发帖的目的,因为它是不相关的):

<div> 
    <%# ((FKMModel.Comment)Container.DataItem).FKMUser.Username %> 
    <%# ((FKMModel.Comment)Container.DataItem).CommentDate.Value.ToShortDateString() %> 
    <%# ((FKMModel.Comment)Container.DataItem).CommentTime %> 
</div> 

第一个绑定发生异常(FKMUser.Username)。由于设置了外键,我不应该在用户表中访问任何属性。智能感知设置了FKMUser导航属性,它知道该外表的属性。这里发生了什么???

您可能需要添加在您的查询“包含”语句,或禁用延迟加载 - 有一些例子在以下问题/ .answers: Entity Framework - Inheritance with .Include?

在你的榜样,你要添加将包括如下:

IQueryable<Comment> CommentQuery = 
      from x in ctx.Comment 
      .Include("<name of FK navigation property">) 
      where x.SiteID == 101 
      select x; 

或者你可以明确禁用延迟加载的背景下 - 取决于你的设计,因为它可以是一个昂贵的练习做完整的对象图负荷。我写了一个blog post a回来,它解决了EF v1中一些FK的“乐趣”。

此外,您可以明确确保FK(导航属性)通过专门加载,例如数据绑定来加载。

if (!<entity>.<navigation property>.IsLoaded) //Ensure the relationship has loaded 
     <entity>.<navigation property>.Load(); 
+0

谢谢!使用包含处理问题。现在精美的作品。 – Nick 2010-03-27 17:50:24

这不是因为你的编码问题。实体密钥参考值为零。即在数据库中外键值mit为空。在做某件事之前检查空状态。

FKMModel.FKMEntities ctx = new FKMModel.FKMEntities(); 
if(ctx.EnitityKey !=null) 
{ 
     IQueryable<Comment> CommentQuery = 
      from x in ctx.Comment 
      where x.SiteID == 101 
      select x; 
     List<Comment> Comments = CommentQuery.ToList(); 
     dl_MajorComments.DataSource = Comments; 
     dl_MajorComments.DataBind(); 
} 

这是在.net 3.5实体框架中的一个错误。

或使用包含关键字

IQueryable<Comment> CommentQuery = 
       from x in ctx.Comment.Include("Users") 
       where x.SiteID == 101 
       select x;