【问题标题】:Why this exception "Operation is not valid due to the current state of the object" in Entity Framework core occured?为什么在实体框架核心中出现“由于对象的当前状态而导致操作无效”的异常?
【发布时间】:2017-01-25 00:43:38
【问题描述】:

我有一个简单的论坛应用程序,每个主题都有很多帖子,每个帖子可能会被多个用户喜欢。应用实体模型如下:

public class ForumTopic
{
    public int ForumTopicId { get; set; }
    public string Subject { get; set; }
    public string UserId { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<ForumPost> ForumPosts { get; set; }
}

public class ForumPost
{
    public int ForumPostId { get; set; }
    public string Message { get; set; }
    public int ForumTopicId { get; set; }
    public virtual ForumTopic ForumTopic { get; set; }
    public string UserId { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<ForumPostFavorite> ForumPostFavorites { get; set; }
}

public class ForumPostFavorite
{
    public string UserId { get; set; }
    public User User { get; set; }
    public int ForumPostId { get; set; }
    public ForumPost ForumPost { get; set; }
}

我想获取当前用户最喜欢的帖子如下。但是此查询会引发“由于对象的当前状态,操作无效”异常。我确信这个查询在实体框架 6 中无异常运行,但是在实体框架核心中会发生这个异常。

public IActionResult Favorite()
{
    var userId = _userManager.GetUserId(User);

    var list =  _dbContext.ForumPostFavorites
        .Where(e => e.UserId == userId)
        .Select(e => e.ForumPost)
        .Take(10)
        .Select(e => new ForumPostFavoriteVm
        {
            ForumPostId = e.ForumPostId,
            ForumTopicId = e.ForumTopicId,
            Message = e.Message,
            Subject = e.ForumTopic.Subject,
        }).ToList();

    return View(list);
}

当我从查询中删除这一行 "Subject = e.ForumTopic.Subject" 时,查询将毫无例外地运行。

【问题讨论】:

    标签: entity-framework entity-framework-core


    【解决方案1】:

    尝试将 Skip() & Take() 放在投影后:

     var list =  _dbContext.ForumPostFavorites
        .Where(e => e.UserId == userId)
        .Select(e => e.ForumPost)
        .Select(e => new ForumPostFavoriteVm
        {
            ForumPostId = e.ForumPostId,
            ForumTopicId = e.ForumTopicId,
            Message = e.Message,
            Subject = e.ForumTopic.Subject,
        })
        .Take(10)
        .ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 2010-10-18
      • 2017-02-25
      相关资源
      最近更新 更多