新的DbContext将旧数据放入数据库

时间:2019-05-13 10:05:11

标签: c# entity-framework-6 dbcontext

我正在使用自动生成的DbContext和MSTest框架测试业务逻辑(在sqlserver数据库中)。 DbContext仅映射实体的一部分,主要用于Web API数据库控制器。测试模式为:

protected U2Db Db; //auto-generated DbContext
protected DbContextTransaction CurrentTransaction;

[TestInitialize]
public void BeforeEveryTest(){
    Db = new U2Db();
    CurrentTransaction = 
       Db.Database.BeginTransaction(IsolationLevel.ReadCommitted);   
}

[TestMethod]
public void Method1() {
    var o = new Order() {Tag="Method1"};
    Db.Orders.Add(o);
    Db.TrySave(); //custom extension. wraps SaveChanges and reports errors if exist

    //checks inner db tables, service broker queues etc. 
    ....
}
[TestMethod]
public void Method2() {

    var o = new Order() {Tag="Method2"};
    Db.Orders.Add(o);
    Db.TrySave(); //wraps SaveChanges and reports errors if exist

    ....
}
[TestCleanup]
public void AfterEveryTest() {
    if (Db == null) return;
    try
    {
        if (CurrentTransaction != null)
        {
            CurrentTransaction.Rollback();
            CurrentTransaction.Dispose();
        }
    }
    catch (Exception e) { };

    Db.Dispose();
}

如果我手动运行任何测试,它将按预期运行。如果我开始运行一批测试(依次为单线程),则其中一些将失败。我在Server Profiler中看到的是事务按预期工作,但是在失败的测试中,数据库会获取先前运行的测试中使用的记录,这让我感觉DbContext实际上不是“新”实例。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

通常,测试应该是无状态的,以避免此类错误。不要为您的DBContext使用字段,而是在每个测试中实例化一个单独的变量,如下所示:

[TestMethod]
public void Method1() {
    var db = new U2Db();
    var o = new Order() {Tag="Method1"};
    db.Orders.Add(o);
    db.TrySave(); //custom extension. wraps SaveChanges and reports errors if exist

    //checks inner db tables, service broker queues etc. 
    ....
}