8

Entity Framework 5 코드 우선 승인을 사용하고 있습니다. 내가 생성자에서 연결 문자열을 추가 한 다음컨텍스트 파일에 연결 문자열에 "공급자 이름"을 추가하는 방법은 무엇입니까?

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"; 
    } 
} 

}

: 여기 내 상황에 맞는 파일입니다. 그러나 "공급자 이름"을 연결 문자열에 추가하는 방법이 있습니까?

+0

연결 문자열은 'SQLClient connection string'처럼 보이므로 공급자가'SQLClient'이므로'OleDB' 연결 문자열에만'Provider name'을 추가합니다. –

답변

6

연결 문자열을 db 컨텍스트에 하드 코딩해야하는 특별한 이유가 있습니까? 일반적으로 설정 파일에 저장해야합니다. 구성 파일에서 공급자를 지정하고 컨텍스트에서 연결 문자열을 참조 할 수 있습니다. 그것은 당신의 문제를 해결할 것입니다.

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

그리고 설정 파일에

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

감사합니다 Nuwan. 그건 잘 작동합니다. – raisul

+1

Azure 구성 설정을 사용하여 로컬 호스트 설정을 바꾸는 것이 좋은 이유입니다. 공급자 특성을 허용하지 않습니다. – Richard

6

예 : 당신은 내부 공급자에 의해 구축했다 제대로 구축 된 연결 문자열을 가지고 DbContext 에 건네 줄 수있는 DbConnection 유형을 준비 할 수 있습니다 . DBContext가 기본이 공장에서 내장

public DbContext(DbConnection existingConnection, bool contextOwnsConnection) 

그래서 그냥 Dbconnection 필요 오버로드 된 생성자를 가지고 있음을

그래서,

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

리콜은 아래를 참조하십시오 ... 코드에서이 연결 문자열을 달성하기 위해 공급자.

System.Data.Entity.Infrastructure.SqlCeConnectionFactory System.Data.Entity.Infrastructure.LocalDbConnectionFactory System.Data.Entity.InfrastructureSqlConnectionFactory : thesr 3 가지로 implmented됩니다

public interface IDbConnectionFactory 

를 참조

그래서 여기에 SQLConnectionFActory를 사용하는 예제가 있습니다. 그러면 DBConnection이 반환됩니다. DBContext에 전달할 수 있습니다. 프로그래밍 여가 시간에 변수를 반복/변경하거나 변수를 만들 수 있습니다. 다른 두 제공자의 경우.

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; 
    }