使用Effort框架(版本1.1.4)对我的数据库层进行单元测试时遇到问题。
我有一个使用Entity framework 6.1.3的数据库层,并且使用数据库优先方法创建模型,因此有一个描述模型的*.edmx
文件。
我已经创建了一个部分类来公开单元测试使用的其他构造函数,如下所示:
public partial class Entities
{
public Entities(DbConnection connection)
: base(connection, true)
{
}
}
简单的单元测试如下所示:
private Entities CreateContext()
{
//var connectionString = ConfigurationManager.ConnectionStrings["Entities"].ConnectionString;
//var connection = Effort.EntityConnectionFactory.CreateTransient(connectionString);
//return new Entities(connection as DbConnection);
var connection = Effort.EntityConnectionFactory.CreatePersistent("name=Entities");
var context = new Entities(connection);
return context;
}
[TestMethod]
public void Testing_Effort_Integration()
{
using (var context = CreateContext())
{
var entity = context.TableEntity.FirstOrDefault(i=> i.Id);
Assert.IsNotNull(entity);
}
}
当我运行单元测试时,它会抛出一行异常:
var connection = Effort.EntityConnectionFactory.CreatePersistent("name=Entities");
{"提供商未返回ProviderManifest实例。"} InnerException消息:{"无法确定存储版本;一个有效的 存储连接或版本提示是必需的。"}
我发现的其他帖子建议更改ProviderManifestToken
文件中的*.edmx
属性来自" 2012"到" 2008"。这似乎解决了这个问题,但是在第一次尝试使用上下文时却给出了另一个例外:
var entity = context.TableEntity.FirstOrDefault(i=> i.Id);
NotSupportedException无法确定提供程序名称 提供者工厂的类型 ' System.Data.EntityClient.EntityProviderFactory&#39 ;.确保 ADO.NET提供程序已在应用程序配置中安装或注册。
任何人都知道如何解决这个问题所以我可以使用Effort实体框架6.1.3 DB-first方法?
我已经成功地使用Effort(版本1.1.4)以数据库优先方法对在EF 4和EF 5中创建的DB层进行单元测试 - 这就是为什么我认为EF版本可能是有意义的...
答案 0 :(得分:22)
我的一位同事找到了我的问题的解决方案!
显然我正在使用" Effort" nuget包而不是" Effort.EF6" nuget包。卸载并安装另一个后,我还必须使用标签更新我的App.Config:
<system.data>
<DbProviderFactories>
<add name="Effort.Provider" invariant="Effort.Provider" description="Effort.Provider" type="Effort.Provider.EffortProviderFactory,Effort" />
</DbProviderFactories>
</system.data>
<entityFramework>
<providers>
<provider invariantName="Effort.Provider" type="Effort.Provider.EffortProviderServices, Effort" />
</providers>
</entityFramework>
我还在SetUp中调用了我的单元测试来注册工作提供者:
[SetUp]
public void Setup()
{
EffortProviderConfiguration.RegisterProvider();
}
这解决了我的问题。希望它可以为其他人提供一些帮助!