我有以下连接字符串:
<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。
任何人都知道如何解决这个问题?
答案 0 :(得分:6)
要使用Oracle创建DbContext而不使用WebConfig,DbContext的继承必须将Oracle连接注入基础构造函数:
class MyDbContext: DbContext
{
public MyDbContext() : base(new OracleConnection("DATA SOURCE=Server; PASSWORD=123;USER ID=SYSTEM"){}
...
}
答案 1 :(得分:3)
在整个下午挣扎之后才找到解决方案。似乎构造函数或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。
答案 2 :(得分:0)
通过在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