8

Sto utilizzando Entity Framework 5 Approccio codice prima. Qui è il mio file Contesto:Come aggiungere il "Nome provider" nella stringa di connessione al file di contesto?

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

}

Qui ho aggiunto la stringa di connessione nel costruttore. Ma esiste un modo per aggiungere il "Nome provider" alla stringa di connessione?

+0

La stringa di connessione è simile a 'SQLClient connection string', quindi il provider è' SQLClient', aggiungiamo 'Nome provider' solo nella stringa di collegamento' OleDB'. –

risposta

6

C'è un motivo particolare per cui si desidera che la stringa di connessione sia codificata nel contesto db. Normalmente dovrebbe essere memorizzato nel file di configurazione. È possibile specificare il provider nel file di configurazione e fare riferimento alla stringa di connessione dal proprio contesto. Questo risolverà il tuo problema.

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

E nel file di configurazione

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

Grazie Nuwan. Funziona bene – raisul

+1

Un buon motivo per non averlo nella configurazione è se si utilizzano le impostazioni di configurazione di Azure per sostituire le impostazioni dell'host locale. Non consentono l'attributo del provider. – Richard

6

Sì: Si può preparare un tipo DbConnection che può essere passato a DbContext che era costruire dal provider sottostante ed ha la stringa di connessione costruito correttamente .

Quindi, per raggiungere questo obiettivo stringa di connessione in codice ... vedi sotto

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

richiamo, che DbContext ha un costruttore di sovraccarico

public DbContext(DbConnection existingConnection, bool contextOwnsConnection) 

quindi basta la DbConnection costruita dalla fabbrica sottostante fornitore. Vedere

public interface IDbConnectionFactory 

che è implmented da thesr 3 tipi:

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

Quindi, ecco un esempio utilizzando SQLConnectionFActory. Ciò restituisce una connessione DB. Che può essere passato a DBContext. È possibile ripetere/modificare o rendere variabile nel proprio tempo libero di programmazione. Per gli altri 2 provider.

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