使用TransactionScope和EF Transactions

时间:2016-04-04 07:14:35

标签: c# entity-framework transactions integration-testing transactionscope

我的问题是针对以下测试:

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 才能保持数据库清洁。因此,在测试完成后清理数据库的任何替代解决方案也会有所帮助。

0 个答案:

没有答案