JetEntityFramework 与 EF 6?

JetEntityFramework vs EF 6?

因为作者要求帮助请求去 Whosebug,所以把它扔在这里。

有一个正在进行中的现有应用程序,最初写入 SQL 服务器。遗憾的是,现在有一个非常古老的 Access 数据库,我 必须 与之交谈。尝试使用 JetEntityFramework 来帮助我,这样我就不需要进行批量替换。出了门,我抛出了这个异常。我怀疑 web.config 有问题,因为正确设置它的文档很少。

错误

System.InvalidOperationException was unhandled by user code
HResult=-2146233079 Message=The 'Instance' member of the Entity Framework provider type 'JetEntityFrameworkProvider.JetProviderFactory, JetEntityFrameworkProvider, Version=1.2.4.0, Culture=neutral, PublicKeyToken=756cf6beb8fe7b41' did not return an object that inherits from 'System.Data.Entity.Core.Common.DbProviderServices'. Entity Framework providers must inherit from this class and the 'Instance' member must return the singleton instance of the provider. This may be because the provider does not support Entity Framework 6 or later; see http://go.microsoft.com/fwlink/?LinkId=260882 for more information.

这是我的 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>

在您的示例中,提供程序使用 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>