我有懒加载,代理创建并不重要(尝试两者真假,没有区别)。
我有这个型号:
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上)
答案 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)
)
现在,我的查询工作正常。我不确定这是否是最好的方法,但无论如何,这不是这个问题的范围。