Только что нашел решение после борьбы с этим весь день. Похоже, что конструктор или DbContext будет использовать либо строку подключения, либо имя строки подключения, что не совпадает. Если вы передадите строку подключения, по умолчанию будет использоваться SqlClient, который является единственной вещью, связанной по умолчанию в .NET
Теперь, если вы, вместо использования всей строки подключения, передадите только имя строки подключения, он будет внутренне проанализировать также параметр «providerName», который имеет имя сборки для поставщика базы данных, например, Oracle.DataAccess.Client.
Таким образом, вместо передачи строки подключения в конструктор DbContext просто передайте имя строки подключения, например:
.config file:
<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, вы должны использовать вместо этого Oracle.DataAccess.Client в providerName.