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

Sam*_*ami 113 c# asp.net entity-framework-4

我收到此错误"无法删除该对象,因为它在ObjectStateManager中找不到."

我的代码是:

    protected MyEntities sqlEntities;

    public virtual void Delete(TEntity entity)
    {
        System.Type t = typeof(TEntity);
        sqlEntities.DeleteObject(entity);
        sqlEntities.SaveChanges();
    }
Run Code Online (Sandbox Code Playgroud)

Lad*_*nka 154

这意味着实体未附加(它未被相同的上下文实例加载).试试这个:

protected MyEntities sqlEntities;

public virtual void Delete(TEntity entity)
{
    sqlEntities.Attach(entity);
    sqlEntities.DeleteObject(entity);
    sqlEntities.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

  • @Matt:不,这意味着您的对象已经附加到另一个上下文.它不能同时连接到两个.您应该使用原始上下文删除实体. (2认同)

Kja*_*tan 60

只是对Ladislav Mrnka的答案进行了一点澄清(应该是接受的答案).

如果像我一样,你有一个像这样的格式的代码:

using (var context = new MyDataContext())
{
    context.MyTableEntity.Remove(EntytyToRemove);
    var nrOfObjectsChanged = context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

..那么你想做什么:

using (var context = new MyDataContext())
{
    // Note: Attatch to the entity:
    context.MyTableEntity.Attach(EntityToRemove);

    context.MyTableEntity.Remove(EntityToRemove);
    var nrOfObjectsChanged = context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

也许这似乎是显而易见的,但我最初并不清楚有必要指定要附加的实体,而不仅仅是上下文.


esb*_*enr 10

只是为了解释Kjartans的解释:

我有:

public Project DeleteProject(int id)
    {
        using (var context = new Context())
        {
            var p = GetProject(id);
            context.Projects.Remove(p);
            context.SaveChanges();
            return p;
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题是我使用自己的方法(GetProject())来获取实体(因此使用另一个上下文来加载实体):

public Project GetProject(int id)
    {
        using (var context = new Context())
        {
            var project = context.Projects
                .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Profession)))
                .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Room)))
                .SingleOrDefault(x => x.Id == id);
            return project;      
        }
    }
Run Code Online (Sandbox Code Playgroud)

一种解决方案可能是将加载的实体附加为Kjartan状态,另一种可能是我的解决方案,以在同一上下文中加载实体:

public Project DeleteProject(int id)
    {
        using (var context = new Context())
        {
            var p = context.Projects.SingleOrDefault(x => x.Id == id);
            if (p == null)
                return p;

            context.Projects.Remove(p);
            context.SaveChanges();
            return p;
        }
    }
Run Code Online (Sandbox Code Playgroud)