使用Entity Framework .NET回滚对数据库所做的更改

3
我正在为测试一个框架编写单元测试用例。单元测试会向现有数据库添加和修改数据。我需要在测试完成后撤销对数据库所做的所有更改,即删除已添加的行并还原已修改的行。
我使用的是Entity Framework 6来访问数据库。底层数据库是SQL Server。EF6提供了支持以实现此目的吗?
目前,我将更改存储在列表中,并引用该列表以清理数据库。但是使用此方法会留下一些残留物。虽然我不确定原因,可能是某些竞争条件或其他原因。
寻找一些简单而有效的替代方案。先谢谢了 :)
1个回答

4

你可以将测试包含在事务中,而不提交更改:

using (TransactionScope scope = new TransactionScope()) {
    //do your stuff
}

但是为了单元测试目的,您可以使用Effort - Entity Framework Unit Testing Tool,它提供了内存数据库操作。

编辑以回复最后一条评论

您可以使用重载的TransactionScope构造函数来控制IsolationLevel,这样您就可以选择读取未提交的更改或不读取。

如果您的代理不在事务中,请检查连接字符串是否相同,这样ado.net就可以识别连接并将其注册到同一个事务中。 如果连接字符串不相同,则可能需要激活分布式事务协调器。这里有一个关于DTC升级的解释:TransactionScope automatically escalating to MSDTC on some machines?


非常感谢您的回答。我在这项技术上还很新。我可以在TransactionScope中依次使用多个DB Contexts,而无需在每个DB Context范围结束时编写context.saveChanges()吗?我希望我的观点表达清楚了。 - Madhur Maurya
2
@MadhurMaurya 是的,你可以这样做。唯一可能会遇到的问题是如果DB上下文之间的连接字符串不同或者你有多个打开的上下文,你需要确保在执行单元测试的机器上启用了"分布式事务协调器服务",否则请确保每个TransactionScope只使用一个打开的连接。 - Scott Chamberlain
@ScottChamberlain 如果我需要在每个事务范围内使用多个打开的连接怎么办? - Madhur Maurya
1
@MadhurMaurya TransactionScope 可以同时处理多个连接,您只需要确保 "分布式事务协调器" Windows 服务正在运行,然后在 using 块内使用多个连接即可。 - Scott Chamberlain
1
@MadhurMaurya:我已经编辑了我的回复,以涵盖您最后的评论。 - mnieto
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接