8

Tôi đang sử dụng Khuôn khổ thực thể 5 Phê duyệt trước mã. Dưới đây là tập tin Bối cảnh của tôi:Cách thêm "Tên nhà cung cấp" trong Chuỗi kết nối vào tệp Ngữ cảnh?

using IMS.Domain.Inventory; 
using IMS.Domain.Security; 
using IMS.Domain.StoredProcedures; 
using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 
using System.Data.Objects; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace IMS.Domain.DBContext 
{ 
    public class IMSDBContext : DbContext 
    { 
     public DbSet<ModuleAccounting> ModuleAccountings { get; set; } 
     public DbSet<ModuleInfo> ModuleInfos { get; set; } 
     public DbSet<ModuleType> ModuleTypes { get; set; } 
     public DbSet<UserAccounting> UserAccountings { get; set; } 
     public DbSet<UserGroup> UserGroups { get; set; } 
     public DbSet<UserInfo> UserInfos { get; set; } 


    // 
    // set a connection string 

    public IMSDBContext() // Constructor of the Context 
    { 
     this.Database.Connection.ConnectionString = 
      "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=IMSDB;Data Source=.\\SQLExpress"; 
    } 
} 

}

Ở đây tôi đã thêm các chuỗi kết nối trong constructor. Nhưng có cách nào để thêm "Tên nhà cung cấp" vào chuỗi kết nối không?

+0

Chuỗi kết nối của bạn trông giống 'Chuỗi kết nối SQLClient', vì vậy nhà cung cấp là' SQLClient', chúng tôi thêm 'Tên nhà cung cấp' chỉ trong chuỗi kết nối' OleDB'. –

Trả lời

6

Có một lý do cụ thể khiến bạn muốn mã chuỗi kết nối được mã hóa cứng trong ngữ cảnh db. Thông thường nó nên được lưu trữ trong tập tin cấu hình. Bạn có thể chỉ định nhà cung cấp trong tệp cấu hình và tham chiếu chuỗi kết nối từ ngữ cảnh của bạn. Điều đó sẽ giải quyết vấn đề của bạn.

public MyDbContext() 
     : base("Name=MyDbContext") 
    { 
    } 

Và trong tập tin cấu hình của bạn

<connectionStrings> 
    <add name="MyDbContext" connectionString="data source=.\sqlexpress;initial catalog=YourDbName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient"/> 
    </connectionStrings> 
+0

Cảm ơn Nuwan. Điều đó hoạt động tốt. – raisul

+1

Lý do chính đáng không có trong cấu hình của bạn là nếu bạn đang sử dụng cài đặt cấu hình Azure để thay thế cài đặt máy chủ cục bộ của mình. Chúng không cho phép thuộc tính của nhà cung cấp. – Richard

6

Có: Bạn có thể chuẩn bị một loại DbConnection có thể được truyền cho DbContext đó là xây dựng bởi nhà cung cấp tiềm ẩn và có chuỗi kết nối được xây dựng đúng cách .

Vì vậy, để đạt được chuỗi kết nối này trong MÃ ... xem dưới đây

<connectionStrings> 
    <add name="MyCTX" connectionString="Data Source=localhost;Initial Catalog=MYDB ;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

thu hồi, mà DBContext có một nhà xây dựng quá tải

public DbContext(DbConnection existingConnection, bool contextOwnsConnection) 

Vì vậy, bạn chỉ cần DBConnection được xây dựng bởi các nhà máy cơ bản các nhà cung cấp. Xem

public interface IDbConnectionFactory 

được implmented bởi thesr 3 loại:

System.Data.Entity.Infrastructure.SqlCeConnectionFactory System.Data.Entity.Infrastructure.LocalDbConnectionFactory System.Data.Entity.InfrastructureSqlConnectionFactory

Vì vậy, đây là ví dụ sử dụng SQLConnectionFActory. Điều đó trả về một DBConnection. Có thể được chuyển tới DBContext. Bạn có thể lặp lại/thay đổi hoặc biến đổi theo chương trình giải trí của mình.Đối với 2 nhà cung cấp khác.

public DbConnection GetSqlConn4DbName(string dataSource, string dbName) { 
     var sqlConnStringBuilder = new SqlConnectionStringBuilder(); 
     sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource; 
     sqlConnStringBuilder.IntegratedSecurity = true; 
     sqlConnStringBuilder.MultipleActiveResultSets = true; 
     // NOW MY PROVIDER FACTORY OF CHOICE, switch providers here 
     var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString); 
     var sqlConn = sqlConnFact.CreateConnection(dbName); 
     return sqlConn; 
    } 
Các vấn đề liên quan