C# 值不能为null:测试数据库时连接
我正在尝试使用Entity Framework 6为我的ASP.NET MVC应用程序运行集成测试 我得到的错误是 System.Data.Entity.Core.EntityException:基础提供程序回滚失败。-->System.ArgumentNullException:值不能为null。C# 值不能为null:测试数据库时连接,c#,sql-server,asp.net-mvc,entity-framework-6,C#,Sql Server,Asp.net Mvc,Entity Framework 6,我正在尝试使用Entity Framework 6为我的ASP.NET MVC应用程序运行集成测试 我得到的错误是 System.Data.Entity.Core.EntityException:基础提供程序回滚失败。-->System.ArgumentNullException:值不能为null。 参数名称:连接 代码如下所示: Database.SetInitializer(new PrimaryInitializerTest()); _context = new PrimaryContex
参数名称:连接 代码如下所示:
Database.SetInitializer(new PrimaryInitializerTest());
_context = new PrimaryContextTest();
_context.Database.Initialize(true);
using (var dbt = _context.Database.BeginTransaction())
{
dbt.Commit();
dbt.Rollback();
}
我还尝试在using语句的正下方调用dbt.underyingTransaction.Connection.Open()
,在调用Rollback()的正下方调用dbt.underyingTransaction.Connection.Close()
。这给了我错误连接未关闭
PrimaryInitializerTest
class
protected override void Seed(PrimaryContextTest context)
{
// (...) Input some values
base.Seed(context);
}
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>();
}
}
PrimaryContextTest
class
protected override void Seed(PrimaryContextTest context)
{
// (...) Input some values
base.Seed(context);
}
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>();
}
}
公共类PrimaryContextTest:DbContext
{
public PrimaryContextTest():base(“PrimaryContextTest”)
{
SetInitializer(新的DropCreateDatabaseAlways());
}
公共数据库集故事{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
modelBuilder.Conventions.Remove();
}
}
连接字符串
<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\u Data
文件夹中…您正在调用Commit
,然后调用Rollback
,但注释指出错误
这个错误不是很直观,我的意思是,ArgumentNullException
永远不会从SDK堆栈中退出
但是当我不小心重用了同一个事务实例,或者调用了两次
Commit
,或者在分层错误恢复逻辑中尝试了两次回滚时,我就遇到了这种情况。错误到底是什么时候发生的?当你启动应用程序时?当我运行测试,程序执行回滚功能时。下面是变量,如果它有帮助的话,尽管我不确定为什么会出现空引用异常,但是Commit
然后立即Rollback
事务实际上是没有意义的。这肯定是一个错误(SQLServer也会抛出一个错误),但它不应该是空错误。我对这样的实体还不熟悉。context.Save()方法中的更改是否已实际保存?我以为它们只是被缓存了,因为当我调用Rollback()时,我没有看到数据库变量的变化。我没有看到它还原我添加到数据库中的项。