【问题标题】:JetEntityFramework vs EF 6?JetEntityFramework 与 EF 6?
【发布时间】:2017-01-01 19:24:06
【问题描述】:

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

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

错误

System.InvalidOperationException 未被用户代码处理
HResult=-2146233079 Message=实体的“实例”成员 框架提供者类型 'JetEntityFrameworkProvider.JetProviderFactory, JetEntityFrameworkProvider,版本=1.2.4.0,文化=中性, PublicKeyToken=756cf6beb8fe7b41' 没有返回一个对象 继承自“System.Data.Entity.Core.Common.DbProviderServices”。 实体框架提供者必须从这个类和 'Instance' 成员必须返回提供者的单例实例。 这可能是因为提供者不支持 Entity Framework 6 或以后;见http://go.microsoft.com/fwlink/?LinkId=260882了解更多 信息。

这是我的 web.config 的相关 sn-p(被要求更改 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 版本
  • 它说明了它首先只支持代码。
  • 这是我正在使用的现有应用程序,所以它完全是代码优先的 :-) 我也在寻找源代码,JetProviderServices.cs 确实是 DbProviderServices 的子类(我显然已经检查了文档。它建议这些堆栈溢出标记以引起作者的注意)
  • 但是您提到旧的数据库已经存在?这表示 db-first。

标签: c# entity-framework jet-ef-provider


【解决方案1】:

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

【讨论】:

  • 是的,我发现它同时按照我上面提到的方式进行操作。稍后将询问下一个错误。大声笑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 2013-10-30
  • 2021-04-14
  • 2015-05-31
相关资源
最近更新 更多