C# 使用efforce.EF6测试急切的加载场景
我们正在使用它为ASP.NETWebAPI2服务构建一个测试套件,该服务针对内存中的数据库工作,在大多数情况下,这是一个美妙的体验 然而,由于与此问题无关的原因,我们不得不在EF6中关闭延迟加载(通过运行C# 使用efforce.EF6测试急切的加载场景,c#,entity-framework,unit-testing,effort,C#,Entity Framework,Unit Testing,Effort,我们正在使用它为ASP.NETWebAPI2服务构建一个测试套件,该服务针对内存中的数据库工作,在大多数情况下,这是一个美妙的体验 然而,由于与此问题无关的原因,我们不得不在EF6中关闭延迟加载(通过运行Configuration.LazyLoadingEnabled=false; 在db上下文的构造函数中),这意味着如果我们忘记.Include()某个位置的关系,然后使用它,我们会得到NullReferenceExceptions。我们希望我们的测试能够捕获这些类型的错误 我们的测试设置基本如
Configuration.LazyLoadingEnabled=false;
在db上下文的构造函数中),这意味着如果我们忘记.Include()
某个位置的关系,然后使用它,我们会得到NullReferenceExceptions
。我们希望我们的测试能够捕获这些类型的错误
我们的测试设置基本如下:
我们如何使用Effort构造和注入db上下文,如果
.Include()
语句丢失,则会失败,但如果它存在,则会起作用?您也必须在构造函数中为Effort.EF6停用它-接受DbConnection
对象的语句
我为我的EF代码第一个项目解决了它,如下所示:
public class MyDataContext : DbContext, IMyDataContext
{
/*
* the ohter stuff like IDbSet<T> etc.
*/
public MyDataContext() : base("name=MyConnectionString")
{
Configure();
}
/// <summary>
/// This constructor is for test usage only!
/// </summary>
/// <param name="connection">Test connection for in memory database</param>
public MyDataContext(DbConnection connection) : base(connection, true)
{
Configure();
}
/// <summary>
/// Configures the data context.
/// </summary>
private void Configure()
{
Configuration.LazyLoadingEnabled = false;
}
}
也许这也可以帮助您。您如何禁用延迟加载?我认为在
DbContext
构造函数中执行此操作将普遍适用代码>在数据库上下文的构造函数中;在我看来,您应该能够为每个单元测试使用原始上下文,并且它应该始终加载您希望它在测试中加载的数据。如果没有发生这种情况,我想知道您的配置是否正确。我会将此标记为可接受的答案,尽管我们已经在这里设置了所有组件。事实证明,实际的问题是测试是并行运行的,但共享一个数据库实例,因此会擦除彼此的数据。(并发很难…)所以我们禁用了测试并行化,现在一切都正常了:)
IDataLoader loader = new CsvDataLoader(@"C:\Temp\Test_CSV_Files");
DbConnection dbConnection = DbConnectionFactory.CreateTransient(loader);
var myDataContext = new MyDataContext(dbConnection);