2015-08-13 19 views
0

我目前在我的工作中正在處理三個單獨的MVC項目,並且只在三個中的一箇中反覆遇到此問題。我似乎無法確定它爲什麼會發生。我發現的所有相關問題似乎都涉及使用隨機數生成器或與其無關的東西。對象中的變量不會更新,除非我在調試過程中檢查變量

Anywho,這是我目前遇到的問題。

public void RemoveLotFromDocument(int documentId) 
    { 
     Document documentWithLotToDelete = _context.Documents.FirstOrDefault(x => x.Id == documentId); 
     try 
     { 
      documentWithLotToDelete.LotNumber = null; 
     } 
     catch 
     { 
      throw new Exception(); 
     } 
     _context.SaveChanges(); 
    } 

特別是在try語句中的行。變量沒有被設置爲空,除非我:

  • 調試
  • 通過代碼逐行
  • 步進通過具有對象屬性檢查在Visual Studio中可變擴展

對於實例中,如果我正在調試,在代碼中插入一個斷點,逐句通過try語句,並展開/檢查_context.SaveChanges處的對象,documentWithLotToDelete.LotNumber保持不變。否則,代碼按照預期工作,將對象設置爲null,然後允許我刪除對象(否則,我會得到期望的DELETE語句與REFERENCE約束衝突)。

我讀到的另一個問題是,可能有某種異常被壓制,因此try和catch語句沒有捕捉到任何有趣的事情。

任何想法爲什麼會發生這種情況,或者我可以看看這個項目與我的其他項目可能會有所不同,但沒有這種效果?

+0

能告訴你的DbContext與它們之間的關係的文檔類和土地類和配置? –

回答

1

否則我得到預期的DELETE語句衝突與基準約束

所以你給的關鍵信息,LotNumber是參考性質,不是原始類型的線之間(如string )。

如果將null分配給非空string屬性,更改跟蹤器將注意到此更改並且EF將保存更改。

但是,該引用屬性documentWithLotToDelete.LotNumber = null;的賦值不會改變任何內容。該值爲null,並且保持爲空。不用找了。如果在調試時達到峯值,則會觸發延遲加載。

  • 在分配之前:當你做到這一點接下來會發生什麼取決於當下documentWithLotToDelete.LotNumber被加載,然後設置爲null和檢測和保存的改變。
  • 作業完成後:再次加載documentWithLotToDelete.LotNumber,但現在不再更改。

補救的辦法是要確保之前,你(想你)修改LotNumber總是加載:

vardocumentWithLotToDelete = _context.Documents 
            .Include(d => d.LotNumber) 
            .FirstOrDefault(x => x.Id == documentId); 
+0

感謝您的解釋和解決方案,完全意義上的完美! –