21

我有这个通常可以工作的代码:

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. 

如何解决这个问题?

4

8 回答 8

27

问题是您不能删除(或移除)分离的实体,也不能两次附加实体。你需要像下面这样的东西。

var entry = db.Entry(myCurrent);
if (entry.State == EntityState.Detached)
    db.myTable.Attach(myCurrent);
db.myTable.Remove(myCurrent);
于 2013-04-11T10:33:35.173 回答
11

如果您刚刚从编辑或删除视图中收到模型,或者自己生成模型,那么 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();
于 2014-09-02T17:45:30.827 回答
10

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

以前我有:

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

}
于 2013-04-16T08:13:02.777 回答
4

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

就我而言,问题是我通过删除 AsNoTracking 来获取数据 AsNoTracking,它解决了。

于 2015-12-21T14:15:40.810 回答
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();
        }
于 2014-01-16T22:37:54.913 回答
1

就我而言,我试图删除一个未从数据库表“学生”中获取的对象。删除对象的错误方法:

var objStudent=新学生();db.Student.Remove(objStudent);

所以请注意这一点。要删除的对象应该来自表

于 2017-07-05T07:24:52.310 回答
0

我有同样的问题。就我而言,我一直在使用两个不同的 DBContext 实例来检索数据和更新/删除。然后我对同一个代码块/方法/类中的所有数据库操作使用了相同的实例,然后问题解决了

于 2016-10-05T09:50:46.467 回答
0

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

dbEntities.Entry(CurrentObj).State = EntityState.Deleted;                
dbEntities.SaveChanges();
于 2020-01-24T12:41:00.240 回答