2013-04-11 52 views
19

发现我有这样的代码,其正常工作:对象不能被删除,因为它没有在ObjectStateManager

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. 

如何解决这一问题?

+0

第二个异常意味着你有'myCurrent'附加到或加载到另一个上下文实例比'db'。 – Slauma 2013-04-11 20:07:33

+0

@Slauma,但这怎么可能? – 2013-04-12 05:43:09

+0

如果您没有正确处理旧的上下文,并且'myCurrent'仍然附加到它,可能会发生这种情况。或者你在上下文'db1'中加载'myCurrent',然后尝试用另一个上下文'db2'删除它。 – Slauma 2013-04-12 11:53:38

回答

6

其他答案没有工作,所以这里是我如何解决它。

以前我有:

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

} 
+0

是的,用ID它为我工作,但我想给一个选项删除对象; if(this.context.Entry(entity).State == EntityState.Detached) { this.dbSet.Attach(entity); } this.dbSet.Remove(entity);它不工作。 – codebased 2014-07-29 05:20:02

+0

这也适用于我。在我的情况下,原因是我使用缓存机制,而不是从数据库中取出缓存中的对象。 – HerbalMart 2014-12-11 10:08:43

25

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

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

我认为检查对象是否被连接可以用'Find(Object [] keyValues)'方法代替。 – 2016-12-08 06:28:16

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(); 
     } 
8

,如果你刚刚收到从模型编辑或删除视图通过邮寄或产生它自己,那么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(); 
+0

准确地说我的问题。非常感谢。 – sitBy 2015-07-10 20:28:53

3

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

对我来说,这个问题是我取的数据AsNoTracking,通过移除AsNoTracking它解决。

0

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

1

在我的情况下,我试图删除不从数据库表“学生”中获取的对象。 错误的删除对象的方法:

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

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

相关问题