8

używam Entity Framework 5 kodowej pierwszy approch. Oto mój plik Kontekst:Jak dodać "Nazwa dostawcy" w ciągu połączenia do pliku kontekstowego?

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

}

tutaj Dodałem ciąg połączenia w konstruktorze. Ale czy istnieje jakiś sposób dodania "nazwy dostawcy" do ciągu połączenia?

+0

Twój ciąg połączenia wygląda jak "Ciąg połączenia SQLClient", więc dostawcą jest 'SQLClient', dodajemy' Nazwę dostawcy' tylko w łańcuchu połączenia OleDB'. –

Odpowiedz

6

Czy istnieje szczególny powód, dlaczego chcesz mieć ciąg połączenia zakodowanego w kontekście db. Zwykle powinien być przechowywany w pliku konfiguracyjnym. Możesz określić dostawcę w pliku konfiguracyjnym i odsyłać ciąg połączenia z kontekstu. To rozwiąże twój problem.

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

A w pliku konfiguracyjnym

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

Dzięki Nuwan. To działa dobrze. – raisul

+1

Nie ma dobrego powodu w konfiguracji, jeśli używasz ustawień konfiguracyjnych Azure, aby zastąpić ustawienia localhost. Nie zezwalają na atrybut dostawcy. – Richard

6

Tak: Można przygotować typ DbConnection które mogą być przekazywane do DbContext który został utworzony przez bazowego dostawcy i ma ciąg połączenia poprawnie zbudowany .

Tak, aby osiągnąć ten ciąg połączenia w kodzie ... zobacz poniżej

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

Przypomnijmy, że DBContext ma przeciążony konstruktora

public DbContext(DbConnection existingConnection, bool contextOwnsConnection) 

więc wystarczy się DbConnection zbudowany przez fabrykę bazowego dostawca. Zobacz

public interface IDbConnectionFactory 

który implmented przez thesr 3 rodzaje:

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

Oto przykład użycia SQLConnectionFActory. To zwraca wartość DBConnection. Które można przekazać do DBContext. Możesz powtórzyć/zmienić lub wprowadzić zmienną podczas programowania. Dla pozostałych 2 dostawców.

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; 
    } 
Powiązane problemy