繁体   English   中英

实体框架明确包含的导航属性为null

[英]Entity Framework explicitly included navigation property is null

我有延迟加载过,并创建代理不要紧( 试用过真与假,没有区别)。

我有这个模型:

public class Comment{

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

    public User Sender { get; set; }

}

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

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

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

但是,即使我明确包含了导航属性,列表中的某些注释对象的Sender设置为null。

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

为什么显式包括的必需导航属性为null? (我正在使用Entity Framework 6.1.3)

好吧,自己弄清楚。 从数据库上下文构造发送者时,必须在原始查询中包括该发送者。

我正在使用:

 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();

然后,我假设Entity Framework只是忽略了(我认为这是微软方面的设计问题)后来包含的导航属性( 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) ))

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM