实体框架 - 使用外键获取null异常
问题描述:
在应该是一个非常简单的场景中遇到一些麻烦。例如目的,我有两个表:实体框架 - 使用外键获取null异常
-Users -Comments
有一个一对多的关系,建立了这一点;有一个从Comments.CommentorID
到Users.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();
答
这不是因为你的编码问题。实体密钥参考值为零。即在数据库中外键值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;
谢谢!使用包含处理问题。现在精美的作品。 – Nick 2010-03-27 17:50:24