文章内容
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)
不错,学习了。