5

由于作者向 StackOverflow 寻求帮助请求,因此在此处抛出此问题。

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

错误

System.InvalidOperationException 未由用户代码处理
HResult=-2146233079 消息=实体框架提供程序类型“JetEntityFrameworkProvider.JetProviderFactory, JetEntityFrameworkProvider, Version=1.2.4.0, Culture=neutral, PublicKeyToken=756cf6beb8fe7b41”的“实例”成员没有返回从“System.Data.Entity.Core.Common.DbProviderServices”继承的对象。实体框架提供者必须从此类继承,并且“实例”成员必须返回提供者的单例实例。这可能是因为提供者不支持 Entity Framework 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>
4

1 回答 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>
于 2017-01-01T20:33:51.783 回答