2011-10-25 91 views
6

我有以下連接字符串:如何手動設置Oracle連接字符串中的DbContext

<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

嘗試在您的connectionString –

+0

@MaxZerbini中添加「provider = System.Data.OracleClient」我曾嘗試過,沒有奏效。 –

回答

6

創建使用Oracle不使用WebConfig一個的DbContext,你的DbContext繼承必須注入Oracle連接到基構造函數:

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

是這個mssing connnectionString? – Seabizkit

3

就找到了解決整個下午與此掙扎之後。似乎構造函數或DbContext將使用連接字符串或連接字符串名稱,如果您傳遞連接字符串,它將默認使用SqlClient,這是默認情況下在.NET中綁定的唯一東西。

現在,如果不使用整個連接字符串,只傳遞連接字符串名稱,那麼它將在內部解析「providerName」參數,該參數具有用於DB提供程序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") 
{ 

} 

這樣,你只需設置一個配置密鑰與n您想要將上下文綁定到連接字符串並在構造函數中使用它。如果這樣做,EF將自動分析整個連接字符串標記,而不僅僅是連接字符串屬性值,因此會加載正確的提供程序。

請注意,我使用的是Oracle.ManagedDataAccess.Client,它只是更新且僅包含在ODAC/ODP.NET v12及更高版本中。如果您使用ODAC 11,則應該在providerName中使用Oracle.DataAccess.Client。

相關問題