【问题标题】:Can generate EDMX but can't run query on Oracle DB可以生成 EDMX 但不能在 Oracle DB 上运行查询
【发布时间】:2015-03-12 05:03:01
【问题描述】:

我无法在 Visual Studio 2013 .NET 4.0 上使用我的 Oracle DB 使用 EF。

这就是我所做的:

  • 安装了 ODTwithODAC121012(我之前也安装过 ODAC1120320_x64)
  • 成功建立新连接
  • 从我的数据库成功生成了一个 edmx(我选择了 EF5)

这是我的 app.config :

   <configSections>
     <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
   </configSections>
   <connectionStrings>
     <add name="Entities" connectionString="metadata=res://*/Entity.PVModel.csdl|res://*/Entity.PVModel.ssdl|res://*/Entity.PVModel.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string=&quot;data source=BWKBX;password=BWKBX;persist security info=True;user id=BWKBX&quot;" providerName="System.Data.EntityClient" />
   </connectionStrings>
   <entityFramework>
     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
   </entityFramework>

在我的代码中,当我可以实例化我的 DbContext 但我无法运行如下查询时:

    db.MY_TABLE_SET.Where(p => p.FOO == "FOO").ToList();

这是我得到的错误:

    System.ArgumentException was unhandled by user code
      HResult=-2147024809
      Message=Soit le fournisseur de magasins spécifié est introuvable dans la configuration, soit il n'est pas valide.
      Source=System.Data.Entity
      StackTrace:
           à System.Data.EntityClient.EntityConnection.GetFactory(String providerString)
           à System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString)
           à System.Data.Entity.Internal.LazyInternalConnection.InitializeFromConnectionStringSetting(ConnectionStringSettings appConfigConnection)
           à System.Data.Entity.Internal.LazyInternalConnection.TryInitializeFromAppConfig(String name, AppConfig config)
           à System.Data.Entity.Internal.LazyInternalConnection.Initialize()
           à System.Data.Entity.Internal.LazyInternalConnection.CreateObjectContextFromConnectionModel()
           à System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
           à System.Data.Entity.Internal.InternalContext.Initialize()
           à System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
           à System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
           à System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
           à System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider()
           à System.Linq.Queryable.Where[TSource](IQueryable`1 source, Expression`1 predicate)
           à OBS.SCAV.AdminKpiBox.Tests.TestVisualizeService.TestOneEnd() dans d:\Workspace\SCAV\G1R1 (DEV)\Web Service\AdminKpiBox\OBS.SCAV.AdminKpiBox.Tests\TestPeriodValidation.cs:ligne 30
      InnerException: System.ArgumentException
          HResult=-2147024809
          Message=Le fournisseur de données .Net Framework demandé est introuvable. Il n'est peut-être pas installé.
          Source=System.Data.Entity
          StackTrace:
               à System.Data.EntityClient.EntityConnection.GetFactory(String providerString)
          InnerException: 

提前谢谢你。

【问题讨论】:

    标签: c# entity-framework odp.net


    【解决方案1】:

    一旦你知道英文的错误是什么,你可能会更好地搜索:

    "配置中找不到指定的store provider,或者无效"

    另外,“无法找到请求的 .Net Framework 数据提供程序。它可能未安装。”

    确保您已正确安装。如果您的应用程序目标是 32 位,请确保运行的 configure.bat 是 32 位的。如果是 64 位,请确保运行 64 位的 configure.bat。请理解 Oracle.DataAccess.Client 是非托管的,这意味着“位数”很重要。

    【讨论】:

    • 你说得对,这有点重要。当您说“configure.bat”时,我不知道您在说什么。我只是运行“setup.exe”^^。可能这个 configure.bat 可以解决我的问题,但我用另一种方式解决了它。请参阅我自己的答案。
    • 当您运行 32 位 ODAC 的安装程序 (setup.exe) 时,它会更新 32 位 machine.config(而不是 64 位计算机配置)。它通过运行 oracle_home/ODP.NET 子目录中的 configure.bat 来实现。所以你通过重新安装做了同样的事情。
    • 我刚刚检查过,它工作正常!非常感谢 !它比我的解决方案更好^^。
    【解决方案2】:

    我终于知道了。

    我不知道为什么,但似乎 Oracle 安装程序(或其他)没有在我的 machine.config 中的 x64 文件夹(C:\Windows\Microsoft.NET\Framework64\ v4.0.30319\Config)。

    但它是在 x86 文件夹 (C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config) 中注册的。我只是将 x86 文件中的行复制/粘贴到 x64 文件中。

    文件中的位置是:

        <system.data>
            <DbProviderFactories>
              <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
              [...]
           </DbProviderFactories>
        </system.data>
    

    【讨论】:

    • 查看 Oracle_Home/ODP.NET/.. 目录中的“configure.bat”文件,它完成了同样的事情。
    猜你喜欢
    • 2018-05-10
    • 2013-01-14
    • 2021-11-23
    • 2021-06-26
    • 2017-08-09
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多