我有这样的事情:
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
}
}
答案 0 :(得分:12)
您必须先从上下文中获取要删除的实体。最好通过比较主键来完成此操作。它可能看起来像这样,但我不知道TabMaster
和TabMasterViewModel
的对象结构,因此属性名称可能错误。
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();
}