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

时间:2010-03-27 17:05:58

标签: c# .net entity-framework

在应该是一个非常简单的场景中遇到一些麻烦。例如,我有两个表:

-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)发生异常。由于设置了外键,因此访问Users表中的任何属性都没有问题。 Intellisense设置FKMUser导航属性,它知道该外表的属性。这是怎么回事?

2 个答案:

答案 0 :(得分:3)

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

在您的示例中,您需要添加Include,如下所示:

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

或者您可以显式禁用上下文的延迟加载 - 取决于您的设计,因为完成对象图加载可能是一项昂贵的练习。我前一段时间写了blog post,它解决了EF v1中FK的一些“乐趣”。

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

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

答案 1 :(得分:0)

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

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中实体框架中的错误。

或使用include关键字

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