2013-06-05 36 views
0

有一堆MVC/EF代碼,我正在調試,其他人已經從Java編寫過渡過。從代碼對象處於分離狀態。當對象被分離時,該操作無法在ObjectStateEntry上執行

一個片斷類似於此:

public ActionResult Index() 
    { 
     using (var context = new Models.FooEntities()) 
     { 
      var exp = context.Expenses.FirstOrDefault(e => e.Id == 17); 

      if (exp != null) 
      { 
       context.Expenses.DeleteObject(exp); 
       context.SaveChanges(); 
      } 
     } 

     return Content("Deleted"); 
    } 

簡單。對?它應該與ID 17

但是刪除實體的費用,調用SaveChanges引發與消息的InvalidOperationException"The object is in a detached state. This operation cannot be performed on an ObjectStateEntry when the object is detached."

現在,我明白了消息,我很驚訝,因爲根據有關機構是從來沒有與上下文分離。至少從我在上面的代碼片段中看到的。

可能不僅僅是滿足眼睛,但我會考慮作爲一個選項,當我沒有更多的選擇,因爲這是一個噩夢跟蹤整個調用堆棧這個大部分寫得不好的Java代碼沒有人理解。

+0

乍一看我唯一能想到的就是在上下文本身中禁用延遲加載_and_刪除實體會觸發級聯刪除,但是不會通過數據庫中的級聯刪除FK約束來實現。 –

+0

這使得很多意義。謝謝。阿瑪明天嘗試並報告回來。 –

+0

它也可以是一個非延遲加載的集合,因爲它不是'虛擬'的,或者可以禁用代理生成。 –

回答

0

你可以嘗試做這樣的修改:

if (exp != null) 
      { 
       context.Expenses.Attach(ex); 
       context.Expenses.DeleteObject(exp); 
       context.SaveChanges(); 
      } 
0

我有同樣的錯誤消息,並且還確保實體不從的DbContext分離。就我而言,事實證明,我忘了定義一個複雜類型,該類型存在於已被顯式分離的類中。在編譯時和數據庫構建時沒有出現任何問題,但在運行時發生此錯誤。一旦複雜類型被正確映射,它就像預期的那樣。也許類似的情況在你的情況下(現在可能已經解決了)。