DbUpdateConcurrencyException触发不是我想的那样

时间:2014-10-24 18:45:49

标签: c# entity-framework unit-testing concurrency entity

我只是在寻找一些澄清,以确保我没有错过任何东西。我有一个关于EF 6.1 ConcurrencyChecking的单元测试,我希望有人可以解释我缺少的东西。

这是我的测试:

    [TestMethod()]
    [TestCategory("DataBound")]
    [ExpectedException(typeof(DbUpdateConcurrencyException))]
    public async Task AccessListConcurrencyCheckTest()
    {
        //Add record to DB for test
        MyDBContext context1 = new MyDBContext();
        AccessListDAO accessListDAO1 = new AccessListDAO(context1);
        AccessList accessList = await accessList1.AddAccessList(accessList);

        //First request get newly added record
        AccessList accessList1 = await accessListDAO1.GetAccessList(accessList.AccessListId);

        //Second request get newly added record
        MyDBContext context2 = new MyDBContext ();
        AccessListDAO accessListDAO2 = new AccessListDAO(context2);
        AccessList accessList2 = await accessListDAO2.GetAccessList(accessList.AccessListId);

        accessList1.Description = "Updated by Request 1";
        await accessListDAO1.UpdateAccessList(accessList1);  //Exception happening here

        //If I uncomment the Delete Below and comment out the Update above, the test works as expected
        //await accessListDAORequest1.DeleteAccessList(testRecordRequest1.AccessListId);

        accessList2.Description = "Updated by Request 2";
        await accessListDAO2.UpdateAccessList(testRecordRequest2); //I would have expected exception here.
    }

如上所述,我原本期望在第二次更新时发生异常,因为第一次获取和第一次更新之间发生的唯一事情是另一次获取,这不应该导致数据更改。任何有关连接这些点的帮助都将不胜感激。

更新:图表变浓,我用删除替换了第一个更新,测试按预期运行。在进一步审查后,我注意到修改日期的毫秒/刻度属性将返回与数据库中存储的不同。如果数据库有2014-10-27 13:57:17.587返回的accessList1返回,毫秒字段为588或5881995,accessList2设置为5870000.如果我进入实际的Update方法,如果查找记录在有一个值有时会匹配其他2个或它自己的值。看起来毫秒值不会作为可靠值返回。我们正在使用SQL后端。

1 个答案:

答案 0 :(得分:0)

为第一个" Get"创建一个新的MyDBContext实例。而不是使用为"添加"似乎可以解决问题并解决问题。我现在仍然确定为什么这是一个问题,因为从表中提取的记录在更新声明之前从未处于任何变化状态。