【问题标题】:Entity Framework explicitly included navigation property is null实体框架显式包含的导航属性为空
【发布时间】:2016-12-01 13:37:16
【问题描述】:

我已经关闭了延迟加载,并且代理创建无关紧要(尝试两者真假,没有区别)。

我有这个模型:

public class Comment{

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

    public User Sender { get; set; }

}

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

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

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

然而,列表中的一些评论对象的Sender设置为null,即使我已经明确包含了导航属性。

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

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

【问题讨论】:

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


    【解决方案1】:

    好的,我自己想通了。当我从数据库上下文构造它时,我必须在原始查询中包含发件人。

    我正在使用:

     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 =&gt; 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 =&gt; p.Comments.Select(c =&gt; c.Sender)

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

    【讨论】:

      猜你喜欢
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      相关资源
      最近更新 更多