Как вручную установить строку подключения Oracle в DbContext - PullRequest
7 голосов
/ 25 октября 2011

У меня есть следующая строка подключения:

<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 Connection, строка не работает.Это происходит потому, что DbContext пытается использовать Oracle ConnectionString для подключения к базе данных сервера Sql, потому что он не получает имя_поставщика.

Кто-нибудь знает, как решить эту проблему?

Ответы [ 3 ]

6 голосов
/ 27 октября 2011

Чтобы создать DbContext с использованием Oracle без использования WebConfig, ваше наследование DbContext должно внедрить соединение Oracle с базовым конструктором:

class MyDbContext: DbContext
{
    public MyDbContext() : base(new OracleConnection("DATA SOURCE=Server; PASSWORD=123;USER ID=SYSTEM"){}
    ...
}
3 голосов
/ 10 сентября 2013

Только что нашел решение после борьбы с этим весь день. Похоже, что конструктор или 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.

0 голосов
/ 10 декабря 2018

Получилось, указав "Фабрика соединений по умолчанию" в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...