在应该是一个非常简单的场景中遇到一些麻烦。例如,我有两个表:
-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
)发生异常。由于设置了外键,因此访问Users表中的任何属性都没有问题。 Intellisense设置FKMUser
导航属性,它知道该外表的属性。这是怎么回事?
答案 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;