JetEntityFramework和EF 6有何区别?

5

因为作者要求寻求帮助的请求提交到StackOverflow,所以我将这个问题放在这里。

我正在开发一个现有应用程序,最初是写给SQL Server的。但很遗憾,现在必须与一个非常古老的Access数据库进行交互。我尝试使用JetEntityFramework来帮助我,这样我就不需要进行全面的替换。但是,在最开始时,我就抛出了这个异常。我怀疑是web.config出了问题,因为正确设置的文档很少。

错误信息:

System.InvalidOperationException未经用户代码处理
HResult=-2146233079 Message='JetEntityFrameworkProvider.JetProviderFactory, JetEntityFrameworkProvider, Version=1.2.4.0, Culture=neutral, PublicKeyToken=756cf6beb8fe7b41' 的实体框架提供程序类型的 'Instance' 成员没有返回从 'System.Data.Entity.Core.Common.DbProviderServices' 继承的对象。 实体框架提供程序必须从此类继承,并且 'Instance' 成员必须返回提供程序的单例实例。 这可能是因为该提供程序不支持实体框架6或更高版本,请参见http://go.microsoft.com/fwlink/?LinkId=260882 了解更多信息。

这里是我的web.config的相关代码片段(被要求更改了DBContext和MDB文件的实际名称):

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="JetEntityFrameworkProvider" type="JetEntityFrameworkProvider.JetProviderFactory, JetEntityFrameworkProvider"/>
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="MyDBContext" 
         connectionString="Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\MyAccessDB.MDB" 
         providerName="JetEntityFrameworkProvider.JetConnection" />
  </connectionStrings>
  <system.data>
    <DBProviderFactories>
      <remove invariant="JetEntityFrameworkProvider"/>
      <add invariant="JetEntityFrameworkProvider"
           name="Jet Entity Framework Provider"
           type="JetEntityFrameworkProvider.JetProviderFactory, JetEntityFrameworkProvider"/>
    </DBProviderFactories>
  </system.data>

提供者是否支持Entity Framework 6或更高版本?我猜这是您正在使用的EF版本。 - Nkosi
它说它只支持Code First。 - Nkosi
请在此处查看 CodePlex 文档 https://jetentityframeworkprovider.codeplex.com/documentation - Nkosi
这是我正在使用的现有应用程序,所以它完全是基于代码的 :-) 我也在查看源代码,JetProviderServices.cs确实是DbProviderServices的子类(我已经清楚地查阅了文档。这就是它建议使用这些堆栈溢出标签来引起作者注意的地方)。 - JoeHz
这里有一个想法。刚刚看了codeplex网站上的演示,并注意到您连接中的提供程序名称和提供程序的invariantName与教程中的不匹配。将JetEntityFrameworkProvider.JetConnection更改为JetEntityFrameworkProvider,看看是否有所不同。您应该查看视频,因为我还注意到配置方面存在一些差异,与您的示例不同。 - Nkosi
显示剩余6条评论
1个回答

4
在您的示例中,提供程序使用JetEntityFrameworkProvider.JetProviderFactory作为其类型。这导致上述异常,因为它没有继承自System.Data.Entity.Core.Common.DbProviderServices。从视频教程和检查源代码可以看出,需要提供程序的类型是JetEntityFrameworkProvider.JetProviderServices
基于项目网站的教程,请检查以下作为示例显示的配置。
  <connectionStrings>
    <add name="MyDBContext" 
         connectionString="Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\MyAccessDB.MDB" 
         providerName="JetEntityFrameworkProvider" />
  </connectionStrings>
 <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider 
        invariantName="JetEntityFrameworkProvider" 
        type="JetEntityFrameworkProvider.JetProviderServices, JetEntityFrameworkProvider"/>
    </providers>
  </entityFramework>
  <system.data>
    <DBProviderFactories>
      <remove invariant="JetEntityFrameworkProvider"/>
      <add 
        invariant="JetEntityFrameworkProvider"
        name="Jet Entity Framework Provider"
        description="Jet Entity Framework Provider"
        type="JetEntityFrameworkProvider.JetProviderFactory, JetEntityFrameworkProvider"/>
    </DBProviderFactories>
  </system.data>

是的,我在按照我上面提到的方法做的同时找到了它。下一个错误将在几分钟后被询问。哈哈 - JoeHz

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