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

时间:2013-04-11 09:25:07

标签: c# .net entity-framework

我有这个通常有效的代码:

db.myTable.DeleteObject(myCurrent);

我收到了这个错误:

The object cannot be deleted because it was not found in the ObjectStateManager.

数据库中的表格中包含相同的成分。

我试过了:

db.myTable.Attach(myCurrent);
db.myTable.DeleteObject(myCurrent);

我又得到了一个错误:

An entity object cannot be referenced by multiple instances of IEntityChangeTracker. 

如何解决这个问题?

8 个答案:

答案 0 :(得分:26)

问题是您无法删除(或删除)已分离的实体,并且无法附加实体两次。你需要像下面这样的东西。

var entry = db.Entry(myCurrent);
if (entry.State == EntityState.Detached)
    db.myTable.Attach(myCurrent);
db.myTable.Remove(myCurrent);

答案 1 :(得分:10)

如果您刚刚通过邮件接收编辑或删除视图模型或自己生成模型,那么EF不知道它,因此您将其状态设置为“已删除”(或EntityState.Modified等)以通知EF:

//generate it yourself if not posted from edit/delete view
//var model = new Model { Id = 123 };

//set to delete
db.Entry(model).State = EntityState.Deleted; // or EntityState.Modified for edit etc.
db.SaveChanges();

答案 2 :(得分:9)

另一个答案没有用,所以这就是我修复它的方法。

以前我曾经:

public void ok(myTable myCurrent)
{
    //delete entries from other tables in relationship with myTable
    db.myTables.DeleteObject(myCurrent);

}

我用它修理了它:

public void ok(int current_id)
{
    //delete entries from other tables in relationship with myTable
    var y = (from x in db.myTables where x.id == current_id select x).First();
    db.myTables.DeleteObject(y);

}

答案 3 :(得分:3)

虽然这个问题是一个老问题,但它可能会帮助另一个有同样错误的人,

在我的情况下,问题是我提取数据AsNoTracking,通过删除AsNoTracking它解决了。

答案 4 :(得分:1)

我在这里找到了答案:

http://www.entityframeworktutorial.net/delete-entity-in-entity-framework.aspx

这是我需要的“断开连接”版本;

       Student stud = null;

        using (SchoolDBContext ctx = new SchoolDBContext())
        {
            stud = (from s in ctx.Students
                    where s.StudentName == "Student1"
                        select s).FirstOrDefault();
        }

        using (SchoolDBContext newCtx = new SchoolDBContext())
        {
            newCtx.Students.Attach(stud);
            newCtx.Students.DeleteObject(stud);
            //you can use ObjectStateManager also
            //newCtx.ObjectStateManager.ChangeObjectState(stud, 
                                    System.Data.EntityState.Deleted);
            int num = newCtx.SaveChanges();
        }

答案 5 :(得分:1)

在我的情况下,我试图删除一个未从数据库表中取出的对象"学生"。 删除对象的错误方法:

var objStudent = new Student();  db.Student.Remove(objStudent);

所以要照顾好这个。要删除的对象应该来自表

答案 6 :(得分:0)

我遇到了同样的问题。在我的情况下,我一直在使用两个不同的DBContext实例来检索数据并更新/删除。然后我在相同的代码块/方法/类中使用相同的实例进行所有数据库操作,然后解决问题

答案 7 :(得分:0)

我在这里找到了答案。 我也尝试了它的工作方式:

dbEntities.Entry(CurrentObj).State = EntityState.Deleted;                
dbEntities.SaveChanges();