我只是在寻找一些澄清,以确保我没有错过任何东西。我有一个关于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后端。
答案 0 :(得分:0)
为第一个" Get"创建一个新的MyDBContext实例。而不是使用为"添加"似乎可以解决问题并解决问题。我现在仍然确定为什么这是一个问题,因为从表中提取的记录在更新声明之前从未处于任何变化状态。