我的问题是针对以下测试:
var connectionString = "Data Source=.\\sqlexpress;Initial Catalog=Axineh;Integrated Security=True";
using (var scope = new TransactionScope())
{
var dbContext = new AppDbContext(connectionString);
// first transaction, save a new Paper
var t1 = dbContext.Database.BeginTransaction();
var paper = new Paper {EnglishName = "Paper", Name = "Paper"};
dbContext.Set<Paper>().Add(paper);
dbContext.SaveChanges();
var paperId = paper.PaperId;
t1.Commit();
var p1 = dbContext.Set<Paper>().Find(paperId); // p1 = paper
// second transaction, does nothing but calling rollback
var t2 = dbContext.Database.BeginTransaction();
t2.Rollback();
var p2 = dbContext.Set<Paper>().Find(paperId); // p2 = null
}
Assert.NotNull(p1);
Assert.Null(p2);
如您所见,我在 TransactionScope 中使用 EF交易。测试 t1 和 t2 有两个EF交易。 t1 (第一个)保存一个新的Paper实体并提交它的更改,然后 t2 (第二个)除了调用Rollback方法之外什么都不做。但是在调用回滚方法之后, t1 上创建的Paper也会回滚。虽然已经承诺了。我不知道为什么会这样,以及如何完成这项任务。
请考虑我的集成测试需要 TransactionScope 才能保持数据库清洁。因此,在测试完成后清理数据库的任何替代解决方案也会有所帮助。