实体框架显式包含导航属性为null

时间:2016-12-01 13:37:17

标签: c# entity-framework entity-framework-6

我有懒加载,代理创建并不重要(尝试两者真假,没有区别)。

我有这个型号:

public class Comment{

    [Required]
    public int SenderID { get; set; }

    public User Sender { get; set; }

}

(当然,我有一个用户类)。

在数据库级别,我确认发件人是有效的User对象。我有一些IQueryable<Comment>名为commentsQuery(基本上会从帖子中收集一些评论。然后我包含发件人导航属性并执行查询:

var comments = commentsQuery.Take(50).OrderBy(c => c.ID).Include(c => c.Sender).ToList();

但是,即使我已明确包含导航属性,列表中的部分注释对象也将其Sender设置为null。

如果我打开延迟加载它可以正常工作,但我不想打开延迟加载。

为什么显式包含的必需导航属性为null? (我在实体框架6.1.3上)

1 个答案:

答案 0 :(得分:0)

好的,只是想通了自己。当我从数据库上下文构建发件人时,我必须在最初的查询中包含发件人。

我正在使用:

 var post = await Database.Posts.Where(p => p.ID == postId && p.Sender.Username == username).Include(p => p.Sender).Include(p => p.Comments).FirstOrDefaultAsync();
 IQueryable<Comment> commentsQuery = post.Comments.ActiveObjects().OrderByDescending(c => c.ID).AsQueryable();

然后,我认为实体框架只是忽略了(我认为这是微软方面的设计问题)后来包含的导航属性(commentsQuery.[...].Include(c => c.Sender))。

我修改了原始查询以包含第二级导航属性:

var post = await Database.Posts.Where(p => p.ID == postId && p.Sender.Username == username).Include(p => p.Sender).Include(p => p.Comments).Include(p => p.Comments.Select(c => c.Sender)).FirstOrDefaultAsync();

(注意添加.Include(p => p.Comments.Select(c => c.Sender)

现在,我的查询工作正常。我不确定这是否是最好的方法,但无论如何,这不是这个问题的范围。