【问题标题】:Issue regarding Entity Framework Core eager loading an item inside of .Include关于 Entity Framework Core 急切加载 .Include 中的项目的问题
【发布时间】:2020-03-04 22:32:05
【问题描述】:

这是我的情况。我有帖子和评论。当我进行查询以获取帖子时,我会这样写:

var queryable = _dataContext.Post
                    .Where(x => x.DateCreated <= initialDateOfPageLoad)
                    .AsQueryable();

var posts = await queryable
                .Include(p => p.User)
                .Include(c => c.Comments) // ***
                .Include(l => l.Likes)
                .OrderByDescending(p => p.DateCreated)
                .ToListAsync();

现在 cmets 实体有一个急切加载的用户。

public class Comment
{
    public int Id { get; set; }
    public int PostId { get; set; }
    public Post Post { get; set; }
    public Guid UserId { get; set; }
    public User User { get; set; } // ***
    public string Body { get; set; }
    public bool Modified { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime? DateModified { get; set; }
}

每当我收到我的帖子时,我都会像这样将 cmets 映射到一个 dto 中:

public class CommentDto
{
    public int Id { get; set; }
    public string Body { get; set; }
    public DateTime DateCreated { get; set; }
    public Guid UserId { get; set; }
    public int PostId { get; set; }
    public string DisplayName { get; set; } // ***
    public string ImagePath { get; set; } // ***
}

因此,我需要应该急切加载评论的用户来插入用户实体上可用的 UserId 和 ImagePath。

现在奇怪的是,评论的用户只有在该用户发表帖子时才会急切地加载...

如果我尝试对尚未发帖的用户发表评论,我将得到空值,并且当我调试时它显示该用户未加载。但是,一旦该用户发表了一篇文章(与该用户发表的文章无关),那么所有内容都会立即正确加载评论。

有人可以解释一下这里发生了什么吗?我不希望每个用户都发表帖子,但我希望他们发表评论。为什么急切加载在这种情况下不起作用?

【问题讨论】:

  • 您不会急切地为 cmets 加载用户,但如果他们发布了帖子,那么它会自动为您修复。 .Include(p=&gt;p.Comments.Select(c=&gt;c.User))
  • @RobertMcKee 我收到错误 Lambda 表达式在 Include 中使用无效。当我添加它时,它甚至不会完成请求。
  • 对不起,试试.Include(p=&gt;p.Comments.User),因为它是0:1的关系。语法是一对多。如果这不起作用,请使用.Include(p=&gt;p.Comments).ThenInclude(c=&gt;c.User)
  • @RobertMcKee 我按照 .Include(p => p.Comments).ThenInclude(c => c.User) 让它工作了。 .Include(p=>p.Comments.User) 通过一个错误。也许它在 ef 核心上有所不同?

标签: c# entity-framework-core


【解决方案1】:

您不会急切地为 cmets 加载用户,但如果他们发了帖子,那么它会自动为您修复。

.Include(p =&gt; p.Comments).ThenInclude(c =&gt; c.User) 添加到您的查询以修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多