我有一个使用实体框架6.1.3的DB层,并且使用数据库优先方法创建模型,所以有一个描述模型的* .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");
{“The provider did not return a ProviderManifest instance.”}
InnerException Message: {“Could not determine storage version; a valid
storage connection or a version hint is required.”}
我发现的其他帖子建议将* .edmx文件中的“ProviderManifestToken”属性从“2012”更改为“2008”.这似乎解决了这个问题,但是在第一次尝试使用这个上下文的时候又提出了另一个例外:
var entity = context.TableEntity.FirstOrDefault(i=> i.Id);
NotSupportedException Unable to determine the provider name for
provider factory of type
‘System.Data.EntityClient.EntityProviderFactory’. Make sure that the
ADO.NET provider is installed or registered in the application config.
任何人都知道如何解决这个问题,所以我可以用实体框架的努力6.1.3 DB-first方法?
我已经成功地使用了努力(1.1.4版),以DB-first方法在EF 4和EF 5中创建的单元测试DB层,这就是为什么我认为EF版本可以感兴趣…
解决方法
显然,我正在使用“努力”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(); }
这解决了我的问题.希望可以为他人提供一些帮助!