使用 dotConnect 和 Entity Framework 6 创建数据库上下文时出现运行时错误

Runtime error while creating database context using dotConnect and Entity Framework 6

我们正在使用 DevArt dotConnect 连接到 Oracle 后端。我们以前的开发机器都使用 dotConnect 8.4.254.4,这是已签入 Subversion 的。我设置了一台新的开发机器并安装了最新版本,即 8.5.616.0。我已经更新了我能找到的每个 8.4 参考,甚至对所有签入的内容都做了 "Find in Files"。但是,这个版本的一些东西破坏了我们的代码。基本上,就在我尝试创建数据库上下文时:

using (var _context = new DbContext())

我得到这个异常:

The 'Instance' member of the Entity Framework provider type 'Devart.Data.Oracle.Entity.OracleEntityProviderServices, Devart.Data.Oracle.Entity, Version=8.5.616.0, Culture=neutral, PublicKeyToken=09af7300eec23701' 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.

我花了很长时间在 Stack Overflow 上搜索类似的错误,并且有很多(也跨许多数据库系统)。有多种解决方案,例如更新不同的 .config 文件和程序集引用,但我几乎已经尝试了所有这些。还有一些关于将 DLL 移出 GAC 并在 Program Files 中直接引用它的建议,我也试过了。我现在不知所措。我怎样才能找到这个问题的原因?我很乐意添加更多有帮助的代码或信息,尽管提问。

更新:

我在对象浏览器中注意到,如果我转到实际的 Devart.Data.Oracle.Entity.OracleEntityProviderServices class,基本类型是 missing:

我想知道这是否与问题有关。

请检查您的 *.config。 entityFramework 部分中提供程序的修订号应为 6 (8.5.616.6) 但在 DbProviderFactories ( http://blog.devart.com/entity-framework-6-support-for-oracle-mysql-postgresql-sqlite-and-salesforce.html#ProviderRegistration ) 中必须为 0 (8.5.616.0):

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <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="Devart.Data.Oracle" type="Devart.Data.Oracle.Entity.OracleEntityProviderServices, Devart.Data.Oracle.Entity, Version=8.5.616.6, Culture=neutral, PublicKeyToken=09af7300eec23701" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="Devart.Data.Oracle" />
      <add name="dotConnect for Oracle" invariant="Devart.Data.Oracle" description="Devart dotConnect for Oracle" type="Devart.Data.Oracle.OracleProviderFactory, Devart.Data.Oracle, Version=8.5.616.0, Culture=neutral, PublicKeyToken=09af7300eec23701" />
    </DbProviderFactories>
  </system.data>
</configuration>

同时删除对 Devart.* 程序集的引用并重新添加它们:

C:\Program Files (x86)\Devart\dotConnect\Oracle\Devart.Data.dll

C:\Program Files (x86)\Devart\dotConnect\Oracle\Devart.Data.Oracle.dll

C:\Program Files (x86)\Devart\dotConnect\Oracle\Entity\EF6\Devart.Data.Oracle.Entity.dll(其修订号为 6)

这个有用吗?

如果升级到 v9.0,请注意命名更改:http://forums.devart.com/viewtopic.php?f=1&t=33571 > Entity Framework 程序集名称更改。