无法为 null 值分配对象引用:在测试数据库时出现 connection 错误

9
我正在尝试使用Entity Framework 6运行我的ASP.NET MVC应用程序的集成测试。我遇到的错误是:
System.Data.Entity.Core.EntityException:底层提供程序在回滚时失败。 ---> System.ArgumentNullException:值不能为空。 参数名称:connection
代码如下:
Database.SetInitializer(new PrimaryInitializerTest());
_context = new PrimaryContextTest();
_context.Database.Initialize(true);

using (var dbt = _context.Database.BeginTransaction())
{
     dbt.Commit();
     dbt.Rollback();
}

我还尝试在使用语句下方添加dbt.UnderlyingTransaction.Connection.Open()调用,以及在调用Rollback()下方添加dbt.UnderlyingTransaction.Connection.Close()调用。这使我得到了错误信息:Connection is not closedPrimaryInitializerTest类。
protected override void Seed(PrimaryContextTest context)
{
    // (...) Input some values
    base.Seed(context);
}

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>();
    }
}

连接字符串

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

上下文字符串

<context type="fcon.DAL.Tests.PrimaryContextTest, fcon, Version=1.0.0.0, Culture=neutral">
    <databaseInitializer type="fcon.DAL.Tests.PrimaryInitializerTest, fcon" />
</context>

我可能做错了什么?

可能需要提到数据库不在App_Data文件夹中...


错误具体是在什么时候发生的?是在启动应用程序时吗? - jpgrassi
当我运行测试时,程序执行回滚函数。如果有帮助的话,以下是变量 http://i.imgur.com/ObGGgww.png - KSHMR
虽然我不确定为什么会出现空引用异常,但 Commit 事务后立即进行 Rollback 是没有意义的。这肯定是一个错误(SQL Server 也会抛出错误),尽管它不应该是一个空错误。 - Rob
我对像这样使用Entity很新。context.Save()方法中的更改是否实际上已保存?我以为它们只是以某种方式被缓存了。 - KSHMR
因为当我只调用Rollback()时,我看不到Database变量的变化。我看不到它将我添加到数据库中的项目还原。 - KSHMR
显示剩余4条评论
1个回答

8
你正在调用 Commit 然后是 Rollback,但注释指出了这个错误。
这个错误并不是很直观,我的意思是,一个 ArgumentNullException 不应该从堆栈下面的 SDK 中发挥作用。
但当我意外地重复使用相同的事务实例、调用了 Commit 两次或在分层错误恢复逻辑中尝试回滚两次时,我遇到了这个问题。

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