2016-12-01 54 views
0

我有懒加载关闭,并且代理创建并不重要(尝试均为 true和false,没有区别)。明确包含的实体框架导航属性为空

我有这样的模式:

public class Comment{ 

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

    public User Sender { get; set; } 

} 

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

在数据库级别,我确认发件人是有效的用户对象。我有一些IQueryable<Comment>命名commentsQuery(即基本上采用从后一些评论然后我包括发件人导航属性并执行查询:

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

然而,一些名单内评论的对象必须即使我已明确包含导航属性,它们的Sender设置为null。

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

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

回答

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)

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