【问题标题】:Value cannot be null: connection while testing database值不能为空:测试数据库时连接
【发布时间】:2016-04-07 13:33:35
【问题描述】:

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

我得到的错误是

System.Data.Entity.Core.EntityException:底层提供程序在回滚时失败。 ---> System.ArgumentNullException:值不能为空。
参数名称:连接

代码如下所示:

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

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

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

PrimaryInitializerTest

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 文件夹中不存在数据库...

【问题讨论】:

  • 错误究竟是什么时候发生的?什么时候启动应用?
  • 当我运行测试时,程序执行回滚功能。如果有帮助,这里是变量i.imgur.com/ObGGgww.png
  • 虽然我不确定你为什么会得到一个空引用异常,但 Commit 然后立即 Rollback 一个事务并没有意义。这绝对是一个错误(SQL Server 也会抛出一个错误),虽然它不应该是一个空错误。
  • 我不熟悉与这样的实体合作。 context.Save() 方法中的更改是否实际保存?我以为它们只是以某种方式被缓存了。
  • 因为当我调用 Rollback() 时,我没有看到数据库变量发生变化。我没有看到它恢复了我添加到数据库中的项目。

标签: c# sql-server asp.net-mvc entity-framework-6


【解决方案1】:

您先调用Commit,然后再调用Rollback,但 cmets 指出了这个错误。

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

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

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    相关资源
    最近更新 更多