2014-09-30 69 views
1

如果我不清楚我的問題,但是我正在處理一個我還不太瞭解的項目,請提前致歉。某個部分。Datacontext.SaveChanges()將不需要的記錄添加到數據庫中

現在我正在進行一個已經存在於項目中的測試,但沒有正確工作,即添加到數據庫的數據沒有被刪除,並且仍然使用來自返工之前的代碼尚未分配。此時此測試正常運行,但在運行之後,數據庫中的記錄應該不會被添加。

在代碼中,您可以在這裏找到http://pastebin.com/YzRqi7dt,您可以看到測試方法。 TestInitialize中添加的記錄被正確刪除,但在完成測試後,數據庫中仍有4條記錄太多。其中2個是測試方法中的ConexioContacts的副本。我知道它是複製的,因爲我在調試期間注意到有8個聯繫人被添加,而不是4個。其他2個聯繫人仍然在數據庫中看起來像他們來自我的種子()方法,但種子)方法不會被調用或任何東西。

的這些4個記錄加法當它進入在後臺DataContext.SaveChanges()(在調試時發現)期間

List<Synchronizer<BaseContact, ExternalContact, ConexioContact>.ConexioEntitySyncContext> matches  = 
      Synchronizer<BaseContact, ExternalContact, ConexioContact> 
      .FindMatches(conexioEntities, externalEntities, _unitOfWork); 

發生。上面的方法可以在這裏找到:http://pastebin.com/t9iMGB31。 DataContext.SaveChanges()在方法結尾處的UnitOfWork.SaveChanges()中被調用。

希望這很清楚,如果沒有,請詢​​問。

隨着親切的問候, Gravinco

編輯:如果我跑我的測試,但我仍然不知道如何或爲何出現錯誤

通過懷亞特厄普提出的交易解決問題,如果有人可以詳細說明一下,我會很感激。

回答

3

你可以做的一件事是將所有工作包裝在一個事務中,並在完成時將其回滾。這應該保持來自數據庫的任何更改。此外,它可以幫助找到問題,如果可能來自不同的測試或東西來了...

添加TransactionScope transaction;對象到您的測試類,並在您TestInit()方法的開始,只是做transaction = new TransactionScope()。然後,你可以用CleanTest()方法替換所有的東西transaction.Dispose();

+0

嘿懷亞特,謝謝你respobnding。問題不是由另一個測試引起的,因爲我只運行我在我的問題中給出的測試。我也發現開始將這些記錄添加到我的DataContext的行是unitOfWork.RepositoryAsync ().Insert(insertConexioEntity);在foreach循環中。在這種情況下,你的建議是否仍然可以解決問題?還是我理解你完全錯了? – Gravinco 2014-09-30 13:03:54

+0

我沒有看到那行(在你的pastebin鏈接中),所以我無法確定。但是,只要數據庫交互全部發生在事務中,那麼這些更改就不應該保存到數據庫中。 – 2014-09-30 13:15:03

+0

我提到的這行是在我給第二個鏈接的第52行的else子句末尾。 然後我會嘗試這個事務,看看它是否有效。我會及時向大家發佈。 – Gravinco 2014-09-30 13:25:09

相關問題