值不能为null:测试数据库时的连接

KSH*_*HMR 8 c# sql-server asp.net-mvc entity-framework-6

我正在尝试使用Entity Framework 6为我的ASP.NET MVC应用程序运行集成测试.

我得到的错误是

System.Data.Entity.Core.EntityException:基础提供程序在Rollback上失败.---> System.ArgumentNullException:Value不能为null.
参数名称:连接

代码如下所示:

Database.SetInitializer(new PrimaryInitializerTest());
_context = new PrimaryContextTest();
_context.Database.Initialize(true);

using (var dbt = _context.Database.BeginTransaction())
{
     dbt.Commit();
     dbt.Rollback();
}
Run Code Online (Sandbox Code Playgroud)

我也尝试dbt.UnderlyingTransaction.Connection.Open()在using语句dbt.UnderlyingTransaction.Connection.Close()下方进行调用,并在调用之下调用Rollback().这给了我错误Connection is not closed.

PrimaryInitializerTest

protected override void Seed(PrimaryContextTest context)
{
    // (...) Input some values
    base.Seed(context);
}
Run Code Online (Sandbox Code Playgroud)

PrimaryContextTest

public class PrimaryContextTest : DbContext
{
    public PrimaryContextTest() : base("PrimaryContextTest")
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<PrimaryContextTest>());
    }

    public DbSet<Story> Stories { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
    }
}
Run Code Online (Sandbox Code Playgroud)

连接字符串

<add name="PrimaryContextTest" 
     connectionString="Data Source=(LocalDb)\mssqllocaldb;Initial Catalog=PrimaryContextTest;Integrated Security=SSPI;AttachDbFilename=|DataDirectory|\PrimaryContextTest.mdf" 
     providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)

上下文字符串

<context type="fcon.DAL.Tests.PrimaryContextTest, fcon, Version=1.0.0.0, Culture=neutral">
    <databaseInitializer type="fcon.DAL.Tests.PrimaryInitializerTest, fcon" />
</context>
Run Code Online (Sandbox Code Playgroud)

我能做错什么?

可能会提到App_Data文件夹中不存在数据库...

Luk*_*ett 5

您先打Commit,然后打Rollback,但是注释指出了这个错误。

该错误不是很直观,我的意思是,ArgumentNullException永远不要从堆栈中退出SDK。

但是,当我不小心重用同一事务实例,或者调用了Commit两次,或者试图在分层错误恢复逻辑中回滚两次时,就遇到了这种情况。