2014-09-30 72 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

相关问题