如何使Effort与EntityFramework配合使用?

8
概述
使用Fitnesse和EF6,但无法启动Effort。
我尝试了所有能找到的帖子中的每一个技巧。
所有帖子都说要调用“RegisterProvider”或添加配置部分。但两者都没有起作用。
到目前为止:
我已经在machine.config的DbProviderFactories部分中添加了“Effort.Provider”。
当我查看DbProviderFactories.GetFactoryClasses()时,我可以看到Effort.Provider。
ProcMon显示它正在查找并找到Effort.dll。
结果:
任何
DbConnectionFactory.CreateTransient();   
Effort.EntityConnectionFactory.CreateTransient(connectionString);   
DbProviderFactory dataFactory = DbProviderFactories.GetFactory(dt.Rows[5]);   

抛出异常

Effort.Exceptions.EffortException: The Effort library failed to register

我还尝试了以下方法:
在Runner.exe.config文件的entityFramework部分中加入"Effort.Provider",但未能使其工作。这只是导致应用程序崩溃。
卸载EF和Effort.EF6,然后重新安装,但没有看到任何明显效果。
在类构造函数和各种启动位置中调用Effort.Provider.EffortProviderConfiguration.RegisterProvider(),但从未在DbProviderFactories.GetFactoryClasses()中显示出Effort.Provider;
如果在app.config的DbProviderFactories部分中添加了"Effort.Provider",它将出现在GetFactoryClasses中,就像machine.config一样。

使用环境:
Windows 10
.Net 4.6
VS 2016
EF 6.1.2(虽然显示已安装6.1.3版本,但不确定意义是什么)

我需要注册DLL或其他东西吗?说明书上没有提到这一点。

更多细节:
App.config

<configuration>
    <runtime>
        <loadFromRemoteSources enabled="true"/>
    </runtime>
    <system.data>
        <DbProviderFactories>
            <add name="Effort.Provider" invariant="Effort.Provider" description="Effort.Provider" type="Effort.Provider.EffortProviderFactory, Effort" />
        </DbProviderFactories>
    </system.data>
</configuration>

我认为可能是到达了Effort工厂,它似乎是Effort.Provider.EffortProviderFactory,并抛出了异常,但事实并非如此。 - BWhite
1个回答

10

看起来你需要在 app.config 文件中注册 "entityFramework" 配置部分。

<configSections>
   <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
 <entityFramework>
   <providers>
      <provider invariantName="Effort.Provider" type="Effort.Provider.EffortProviderServices,Effort" />
    </providers>
 </entityFramework>

然后在您的代码中创建Effort连接并将其传递给您的DbContext。如果您还没有接受System.Data.Common.DbConnection类型对象参数的构造函数,请创建一个。

System.Data.Common.DbConnection connection = DbConnectionFactory.CreateTransient();
var context = new MyContext(connection);

我也建议在你的app.config中设置一个connectionString。我相信CreateTransient调用将为您创建一个连接,但如果您要测试的代码中有其他地方创建另一个dbContext的代码,Effort将查找app.config以获取该信息。下面是一个示例,它将创建一个短暂的数据库,以便在一个测试中完成的所有操作不会影响另一个测试。

<add name="DefaultConnection" connectionString="Data Source=in-process;IsTransient=true" providerName="Effort.Provider" />

默认连接部分是我唯一没有的部分。我会尝试一下。我没有在那个方向上仔细查看,因为我认为那会产生不同的错误,而不是阻止类被创建。 事实上,我在构造函数中写入控制台。 我有充分的理由相信这个错误。它只是找不到它。即使 procmon 显示它正在读取 effort 库。 - BWhite
我也遇到了同样的问题,但这个答案并没有解决它。还有其他的想法吗? - Jess
1
我能想到的唯一一件事就是确保在您的 app.config 中,将以下部分作为 <configuration> 元素的子元素: 确保不变名称与 EF 提供程序部分中的 invariantName 匹配。 - Bobby Erikson
感谢 Bobby 提供了我缺失的重要线索——原始文章没有提供连接字符串,该字符串是让程序运行起来的关键。 - mattpm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接