文章内容
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)
3、无法删除此对象,因为未在 ObjectStateManager 中找到它。
4、Tip 9 – How to delete an object without retrieving it
5、ObjectStateManager.ChangeObjectState Method (Object, EntityState)
黄兵个人博客原创。
dang dang on 回复 有用(2)
不错,学习了。