【问题标题】:How to set manually an Oracle Connection String in a DbContext如何在 DbContext 中手动设置 Oracle 连接字符串
【发布时间】:2011-12-15 04:44:06
【问题描述】:

我有以下连接字符串:

<add name="DataContext" connectionString="DATA SOURCE=Server;
PASSWORD=123;USER ID=SYSTEM" providerName="Oracle.DataAccess.Client"/>

我的业务逻辑决定我需要手动读取数据库的连接字符串:

class MyDbContext: DbContext
{
    public MyDbContext() : 
    base(ConfigurationManager.ConnectionStrings["DataContext"].ConnectionString){}
    ...
}

它适用于 Sql Server,但是当我更改为 Oracle 连接字符串时不起作用。这是因为 DbContext 尝试使用 Oracle ConnectionString 连接 Sql Server 数据库,因为它没有收到 providerName。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 尝试在您的连接字符串中添加“provider=System.Data.OracleClient”
  • @MaxZerbini 我试过了,没用。

标签: asp.net-mvc oracle ef-code-first


【解决方案1】:

要使用 Oracle 而不使用 WebConfig 创建 DbContext,您对 DbContext 的继承必须将 Oracle Connection 注入到基本构造函数:

class MyDbContext: DbContext
{
    public MyDbContext() : base(new OracleConnection("DATA SOURCE=Server; PASSWORD=123;USER ID=SYSTEM"){}
    ...
}

【讨论】:

    【解决方案2】:

    在苦苦挣扎了一下午后才找到解决方案。似乎构造函数或 DbContext 将使用连接字符串或连接字符串名称,这是不一样的,如果您传递连接字符串,它将默认为 SqlClient,这是 .NET 中默认捆绑的唯一东西

    现在,如果您不使用整个连接字符串,而是仅传递连接字符串名称,那么它还将在内部解析“providerName”参数,该参数具有数据库提供程序 Oracle.DataAccess.Client 的程序集名称。

    所以不要将连接字符串传递给 DbContext 构造函数,只需传递连接字符串名称,如下所示:

    .config 文件:

    <connectionStrings>
        <add name="SQLServer" connectionString="Server=localhost; Database=MyDb; User ID=MyUser;Password=MyPwd;Pooling=false" providerName="System.Data.SqlClient" />
        <add name="Oracle" connectionString="Data Source=localhost:1521/XE;Persist Security Info=True;User ID=MyUser;Password=MyPwd;" providerName="Oracle.ManagedDataAccess.Client"/>
    </connectionStrings>
    <appSettings>
        <add key="DefaultConnection" value="Oracle" />
    </appSettings>
    

    在您的 DbContext 中:

    public MyDbContext()
        : base("DefaultConnection")
    {
    
    }
    

    这样,您只需使用要挂钩上下文的连接字符串的名称设置一个配置键,并在构造函数中使用它。如果您这样做,EF 将自动解析整个连接字符串标记,而不仅仅是 connectionString 属性值,因此,加载正确的提供程序。

    请注意,我使用的是较新的 Oracle.ManagedDataAccess.Client,它仅包含在 ODAC / ODP.NET v12 及更高版本中。如果您使用 ODAC 11,您应该在 providerName 中使用 Oracle.DataAccess.Client。

    【讨论】:

    • 是的.. . 如果我们不使用配置文件会怎样
    【解决方案3】:

    通过在 web/app .config 中指定“默认连接工厂”使其工作

    <configuration>
    ...
        <entityFramework>
            <defaultConnectionFactory type="Oracle.ManagedDataAccess.EntityFramework.OracleConnectionFactory, Oracle.ManagedDataAccess.EntityFramework" />
            <providers>
              ...
    

    https://docs.oracle.com/cd/E63277_01/win.121/e63268/entityCodeFirst.htm

    【讨论】:

      猜你喜欢
      • 2019-06-26
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 2016-06-22
      相关资源
      最近更新 更多