【问题标题】:Datacontext.SaveChanges() adds unwanted records to databaseDatacontext.SaveChanges() 将不需要的记录添加到数据库
【发布时间】:2014-09-30 22:30:18
【问题描述】:

如果我不清楚我的问题,但我正在做一个我还不太了解的项目,我提前道歉,所以请随时要求详细说明某个部分。

现在我正在做一个已经存在于项目中但无法正常工作的测试,即添加到数据库中的数据没有被删除,并且它仍然使用我在返工之前的代码t 尚未分配。此时测试工作正常,但在运行后,数据库中仍有一些不应该添加的记录。

在代码中,你可以在这里找到 http://pastebin.com/YzRqi7dt ,你可以看到测试方法。在 TestInitialize 中添加的记录被正确删除,但在完成测试后,数据库中仍有 4 条记录过多。其中 2 个是测试方法中 ConexioContacts 的副本。我知道它是副本,因为我在调试期间的某个时刻注意到添加了 8 个联系人而不是 4 个。数据库中保留的其他 2 个联系人看起来像是来自我的 Seed() 方法,但不会调用 Seed() 方法或任何其他方法。

这4条记录的添加发生在

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

当它在后台输入DataContext.SaveChanges() 时(在调试时发现)。上面的方法可以在这里找到:http://pastebin.com/t9iMGB31。 DataContext.SaveChanges() 在方法结束时在 UnitOfWork.SaveChanges() 中被调用。

希望这很清楚,如果没有,请询​​问。

诚挚的问候, 格拉文科

编辑:

如果我运行测试,Wyatt Earp 建议的事务解决了问题,但我仍然不知道错误是如何或为什么发生的,如果有人能详细说明这一点,我将不胜感激。

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    您可以做的一件事是将所有工作封装在事务中,并在完成后回滚。这应该可以防止任何更改影响数据库。此外,如果它可能来自不同的测试或其他东西,它可能有助于定位问题......

    TransactionScope transaction; 对象添加到您的测试类,并在您的TestInit() 方法的开头,只需执行transaction = new TransactionScope()。然后,您可以将 CleanTest() 方法中的所有内容替换为 transaction.Dispose();

    【讨论】:

    • 嗨,怀亚特,感谢您的回复。问题不是由另一个测试引起的,因为我只运行我在问题中给出的测试。我还发现开始将这些记录添加到我的 DataContext 的行是 unitOfWork.RepositoryAsync().Insert(insertConexioEntity);在 foreach 循环中。在这种情况下,您的建议是否仍然可以解决问题?还是我完全理解错了?
    • 我看不到该行在哪里(在您的 pastebin 链接中),所以我无法确定。但是,只要数据库交互都发生在事务中,那么就不应将更改保存到数据库中。
    • 我提到的那一行是在我给出的第二个链接中的 else 子句的末尾,第 52 行。我会尝试这个事务,看看它是否有效。我会及时通知你。
    • @Gravinco 啊,抱歉,我没有看到第二个链接。是的,由于该对象被传递给方法,它应该与事务的其余部分一起回滚。
    • 好的,事务为测试工作,明天我会尝试看看如果我在不测试但实际运行项目时进入 FindMatches() 方法,代码是否仍然正常工作看看问题出在我的测试还是代码本身。无论如何谢谢:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多