2011-10-25 38 views
6

Tôi có chuỗi kết nối sau:Làm thế nào để cài đặt thủ công một Connection String Oracle trong một DbContext

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

logic kinh doanh của tôi xác định tôi cần phải đọc bằng tay chuỗi kết nối cơ sở dữ liệu:

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

Nó hoạt động đúng với Sql Server nhưng khi tôi thay đổi thành chuỗi kết nối Oracle không hoạt động. Nó xảy ra vì DbContext cố gắng sử dụng Oracle ConnectionString để kết nối trên cơ sở dữ liệu Sql Server vì nó không nhận được providerName.

Bất kỳ ai biết cách giải quyết vấn đề này?

+0

cố gắng thêm "provider = System.Data.OracleClient" vào kết nối của bạnString –

+0

@MaxZerbini Tôi đã thử điều đó, không hoạt động. –

Trả lời

6

Để tạo một DbContext sử dụng Oracle mà không cần sử dụng webconfig, thừa kế lại DbContext phải tiêm một kết nối Oracle để xây dựng cơ sở:

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

là mssing connnectionString ??? – Seabizkit

3

Chỉ cần tìm thấy các giải pháp sau khi vật lộn với điều này tất cả các buổi chiều. Dường như hàm tạo hoặc DbContext sẽ sử dụng chuỗi kết nối hoặc tên chuỗi kết nối, không giống nhau, nếu bạn chuyển một chuỗi kết nối, nó sẽ mặc định là SqlClient, là thứ duy nhất được đóng gói theo mặc định trong .NET

, nếu bạn, thay vì sử dụng toàn bộ chuỗi kết nối, chỉ cần truyền tên chuỗi kết nối sau đó nó sẽ phân tích nội bộ cũng là tham số "providerName" có tên assembly cho nhà cung cấp DB Oracle.DataAccess.Client chẳng hạn.

Vì vậy, thay vì đi qua các chuỗi kết nối để các nhà xây dựng DbContext chỉ cần vượt qua tên chuỗi kết nối, như thế này:

.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> 

Và trong DbContext của bạn:

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

} 

Bằng cách đó bạn chỉ cần thiết lập khóa cấu hình với n ame của chuỗi kết nối bạn muốn nối ngữ cảnh và sử dụng nó trong hàm tạo. Nếu bạn làm theo cách này, EF sẽ tự động phân tích cú pháp toàn bộ thẻ chuỗi kết nối và không chỉ giá trị thuộc tính connectionString, do đó, tải đúng nhà cung cấp.

Lưu ý rằng tôi đang sử dụng Oracle.ManagedDataAccess.Client mới hơn và chỉ có trong ODAC/ODP.NET v12 trở lên. Nếu bạn sử dụng ODAC 11, bạn nên sử dụng Oracle.DataAccess.Client trong providerName để thay thế.

Các vấn đề liên quan