2013-04-11 86 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);

所以照顧這個。刪除的對象應該來自表

相關問題