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

C# 无法删除该对象,因为在ObjectStateManager中找不到该对象,c#,asp.net,entity-framework-4,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.Sav

我收到以下错误:“无法删除对象,因为在ObjectStateManager中找不到它。”

我的代码是:

    protected MyEntities sqlEntities;

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

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

protected MyEntities sqlEntities;

public virtual void Delete(TEntity entity)
{
    sqlEntities.Attach(entity);
    sqlEntities.DeleteObject(entity);
    sqlEntities.SaveChanges();
}

您可以编写以下代码:

var x=yourquery.FirstOrDefault(); 

sqlEntities.DeleteObject(x);
sqlEntities.SaveChanges();

只是一个小的澄清(这应该是公认的答案)

如果像我一样,您的代码格式如下:

using (var context = new MyDataContext())
{
    context.MyTableEntity.Remove(EntytyToRemove);
    var nrOfObjectsChanged = context.SaveChanges();
}
…那么这就是你想要做的:

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

    context.MyTableEntity.Remove(EntityToRemove);
    var nrOfObjectsChanged = context.SaveChanges();
}

也许这看起来很明显,但我一开始并不清楚是否有必要指定要附加到的实体,而不仅仅是上下文

仅就克雅尔坦的解释进行说明:

我有:

public Project DeleteProject(int id)
    {
        using (var context = new Context())
        {
            var p = GetProject(id);
            context.Projects.Remove(p);
            context.SaveChanges();
            return p;
        }
    }
问题是我使用自己的方法(GetProject())来获取实体(因此使用另一个上下文来加载实体):

一种解决方案可以是按照Kjartan的说法附加加载的实体,另一种解决方案可以是mine解决方案,以便在相同的上下文中加载实体:

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;
        }
    }

您应该确保您的对象存在于要从中删除的列表中, 您应该设置以下条件

if(context.entity.contains(您的对象))

移除它

如果等式的条件复杂,则应覆盖 实体类中的equal方法来设置相等条件,
要获取扩展方法实体的正确方式,请确保传入Remove(实体)的模型与数据库记录完全相同

有时,传递模型时可能不带Id或Date等字段。如果您以表单形式发布,请将其保存在@html.Hiddenfor中

最好的方法是使用Find(ID)方法传递ID并获取实体,然后将其传递给Remove(entity)


希望这对某人有所帮助。

如果上述方法均无效,您可以尝试以下解决方案:


context.Entry(yourObject).State=System.Data.Entity.EntityState.Deleted;
SaveChanges();

我知道这个问题很老了,但上面的问题对我都不起作用,因为我从多个类/服务中删除了寄存器,并且每个类/服务都实例化了自己的数据库连接上下文

我所做的是将第一个创建的上下文发送到要访问数据库的其余类/服务

例如,我的
serviceA
将删除它的一些寄存器,并调用
serviceB
serviceC
对它们的寄存器执行相同的操作


然后,我将删除
serviceA
上的寄存器,并将
serviceA
上创建的上下文作为参数传递给
serviceB
serviceC
我得到了这个问题并解决了它。只需复制以下代码:

sqlEntities.Attach(entity);
sqlEntities.Remove(entity);
sqlEntities.SaveChanges();

在我的例子中,有一个上下文,但我得到了一个带有'AsNoTracking'选项的实体

很抱歉,代码中出现了一个问题,使用了不同的datacontext对象来获取和删除记录;删除对象(实体)我试图创建一个PK设置正确的模拟实体,希望实体框架能够基于PKISLAV调用DeleteObject。当我从父对象中删除子数据时,有两个上下文在进行,这对我很有帮助,父对象数据是在TransactionScope之外的不同上下文中调用的。将父调用移到作用域和同一上下文中,我的问题就解决了。@Ladislav:如果我使用.Attach,我将得到一个不同的错误:“一个实体对象不能被多个IEntityChangeTracker实例引用。”这是否意味着已经有其他对象实例处于活动状态,无法删除?@Matt:不,这意味着您的对象已附加到另一个上下文。它不能同时连接到两个。您应该使用原始上下文来删除实体。@Ladislav:谢谢,这帮助我进一步查找-我发现了这个问题,似乎可以回答如何解决它:。你是对的,这似乎是我的问题。谢谢你的快速回答!感谢提醒,我只是在更新记录时附加了它,而不是在删除记录时附加了它。我使用此方法并收到异常:“Store update、insert或delete语句影响了意外的行数(0)。自加载实体后,实体可能已被修改或删除。刷新ObjectStateManager条目。”
sqlEntities.Attach(entity);
sqlEntities.Remove(entity);
sqlEntities.SaveChanges();