文章内容

2018/2/2 14:50:56,作 者: 黄兵

无法删除此对象,因为未在 ObjectStateManager 中找到它

今天在修改多数据删除的时候,删除父数据,首先要删除子数据,在EntityFramework中执行如上删除代码如下:

using (var uow = new UnitOfWork())
{
    var Article = uow.BlogRepository.Get(x => x.Id == id);

    if (Article == null)
    {
        return View("Error", new string[] { "文章未找到!" });
    }
    else
    {
        //先删除文章,再删除评论,最后删除索引
        //删除评论
        var commentToBlog = uow.CommentRepository.GetAll().Where(c => c.BlogId == id).AsNoTracking().ToList();
        //no comment
        if (commentToBlog.Count() == 0)
        {
            //直接删除文章
            saveChange blogDele = new saveChange();
            blogDele.DeletedDatset(id);
            //评论多条
        }
        else if (commentToBlog.Count() >= 1)
        {
            //循环删除
            foreach (var item in commentToBlog)
            {
                //判断是否有回复
                var commentReply = uow.CommentReplyRepostiory.GetAll(x => x.ParentId == item.Id).AsNoTracking().ToList();
                if (commentReply.Count() != 0)
                {
                    //删除回复
                    foreach (var itemReply in commentReply)
                    {
                        uow.CommentReplyRepostiory.Delete(itemReply);
                    }
                    uow.SaveChanges();
                }
                uow.CommentRepository.Delete(item);
            }
            uow.SaveChanges();
            //先删除评论再删文章
            saveChange blogDele = new saveChange();
            blogDele.DeletedDatset(id);
        }

        //删除索引
        SearchIndexManager.GetInstance().DeleteQueue(id.ToString());
    }
    //清空所有缓存
    RedisManager.Clear();
}

执行以上删除会报错,报错内容如下:

无法删除此对象,因为未在 ObjectStateManager 中找到它。

解决方案:

在修改删除方法,如下:

public void Delete(T entity)
{
    _dbSet.Attach(entity);
    _context.Entry(entity).State = EntityState.Deleted;
    _dbSet.Remove(entity);
    
}

最后问题解决,出现这个问题主要的原因是因为:没有找到ObjectStateManager的状态,只要设置ObjectStateManager的状态就可以解决这个问题,用如下方法设置ObjectStateManager状态:

_context.Entry(entity).State = EntityState.Deleted;

设置ObjectStateManager为删除状态。

以上个人理解,如有错误,请大家指正。

参考资料:

1、DbSet.Attach Method (Object)

2、How to delete objects in MVC/Entity Framework: The object cannot be deleted because it was not found in the ObjectStateManager

3、无法删除此对象,因为未在 ObjectStateManager 中找到它。

4、Tip 9 – How to delete an object without retrieving it

5、ObjectStateManager.ChangeObjectState Method (Object, EntityState)

黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - 无法删除此对象,因为未在 ObjectStateManager 中找到它

分享到:

发表评论

评论列表

user-ico

dang dang on 回复 有用(2

不错,学习了。