8

Я использую Entity Framework 5 Code-first approch. Вот мой контекст файла:Как добавить «Имя поставщика» в строку подключения к файлу контекста?

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», поэтому поставщик «SQLClient», мы добавляем «имя поставщика» только в строку соединения «OleDB». –

ответ

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

Да: Вы можете подготовить тип DbConnection, который может быть передан в DbContext , который был построить подстилающей поставщика и имеет строку подключения встроенный правильно ,

Таким образом, чтобы достичь этой строки подключения в коде ... см ниже

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

Напомним, что DbContext имеет перегруженный конструктор

public DbContext(DbConnection existingConnection, bool contextOwnsConnection) 

Так что вам просто нужно DBConnection построенный основной завод поставщик. См

public interface IDbConnectionFactory 

который implmented по thesr 3 типов:

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

Так вот пример использования SQLConnectionFActory. Это возвращает DBConnection. Который может быть передан в DBContext. Вы можете повторить/изменить или внести переменную в свой программный досуг. Для других 2 провайдеров.

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; 
    } 
Смежные вопросы