无法删除该对象,因为在ObjectStateManager中找不到该对象

时间:2011-06-07 10:05:12

标签: asp.net-mvc entity-framework

我有这样的事情:

public void Delete(T entity)
        {
            Context.DeleteObject(entity);
            Context.SaveChanges();
        }

我结束了异常: “无法删除该对象,因为在ObjectStateManager中找不到该对象。” 如果我尝试使用AttachTo()将实体添加到 objectContext,我会得到:

“ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象。”

什么错了?

示例:

namespace CAFM.Data.Repository
{
    public abstract class RepositoryBase<T> : IRepository<T>
        where T : EntityObject
    {
        public RepositoryBase()
            : this(new CAFMRepositoryContext())
        {
        }
        static RepositoryBase()
        {
        }
        public RepositoryBase(IRepositoryContext repositoryContext)
        {
            _context = repositoryContext ?? new CAFMRepositoryContext();
            _entity = _repositoryContext.ObjectContext.CreateObjectSet<T>();
        }
        private readonly ObjectContext _context;
        private readonly ObjectSet<T> _entity;
        protected ObjectContext Context
        {
            get { return _context; }
        }
        protected IObjectSet<T> Entity
        {
            get { return _entity; }
        }



        #region IRepository Members

        private string GetEntityName()
        {
            return string.Format("{0}.{1}", _entity.EntitySet.EntityContainer, _entity.EntitySet.Name);
        }
        public T Add(T entity)
        {
            var fqen = GetEntityName();
            Context.AddObject(fqen, entity);
            Context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
            return entity;
        }
        public T Update(T entity)
        {
            Context.ApplyCurrentValues(GetEntityName(), entity);
            Context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
            return entity;
        }
        public void Delete(T entity)
        {
            Context.DeleteObject(entity);
            Context.SaveChanges();
        }
        #endregion
    }
}

2 个答案:

答案 0 :(得分:12)

您必须先从上下文中获取要删除的实体。最好通过比较主键来完成此操作。它可能看起来像这样,但我不知道TabMasterTabMasterViewModel的对象结构,因此属性名称可能错误。

public void Delete(TabMasterViewModel entity) { 
    TabMaster des = _tabmasterRepository.FirstOrDefault( e.Id = entity.ID );
    if (des != null) {
        _tabmasterRepository.Delete(des); 
    }
} 

您已创建新实体并将视图模型中的值映射到该实体。但是上下文不知道实体,所以他无法删除它。

答案 1 :(得分:2)

您可以将对象“附加”到当前上下文中,如下所示:

public void Delete(T entity)
{
    context.AttachTo(entity.EntityKey.EntitySetName, entity);
    Context.DeleteObject(entity);
    Context.SaveChanges();
}