在一个非常简单的场景中遇到了一些麻烦。出于示例目的,我有两个表:
-用户 -评论
为此建立了一对多关系;从 Comments.CommentorID
到 Users.UserID
有一个外键。当我执行 LINQ 查询并尝试绑定(bind)到 DataList
时,出现 null 异常。这是代码:
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>
第一次绑定(bind) (FKMUser.Username
) 时发生异常。由于设置了外键,因此我从 Users 表访问任何属性应该没有问题。 Intellisense 设置了 FKMUser
导航属性,并且它知道该外部表的属性。这是怎么回事???
最佳答案
您可能需要在查询中添加“包含”语句,或禁用延迟加载 - 以下问题/答案中有一些示例: 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(导航属性)来显式确保加载它,例如在数据绑定(bind)上。
if (!<entity>.<navigation property>.IsLoaded) //Ensure the relationship has loaded
<entity>.<navigation property>.Load();
关于c# - Entity Framework - 使用外键获取空异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2530129/