2015-12-18 15 views
6

Ho una DLL che utilizza Entity Framework 6 per eseguire alcune operazioni di database. Sto usando un primo approccio al database. Il modello e tutto ciò che riguarda Entity Framework, come la stringa di connessione in App.config, sono stati creati tramite la wizzard in Visual Studio.Entity Framework 6 set stringa di connessione nel codice

Così ho compilato la DLL e l'ho messa insieme con il corrispondente .config nella cartella in cui si attende l'applicazione che usa la dll.

Tutto funziona correttamente finché non arrivo al punto in cui viene effettuata una chiamata al database. Ci ottengo l'errore:

Cannot find connection string for MyDatabaseEntity

connectionstring generato automaticamente è, come ho detto, nel file di configurazione della DLL. Non riesco a modificare App.config dell'applicazione. Ma l'applicazione consegna un oggetto che ha tutte le informazioni di cui ho bisogno per costruire da solo la stringa di connessione. Quindi sto cercando un modo per impostare la stringa di connessione nel codice senza fare affidamento su un file di configurazione. Tutte le esercitazioni che trovo per un primo approccio al database usano comunque questo metodo. Ho trovato un post qui che dice semplicemente dare la stringa di connessione come parametro quando si crea l'oggetto come

MyDatabaseEntities = new MyDatabaseEntities(dbConnect); 

ma'MyDatabaseEntities' non ha un costruttore che accetta i parametri

public partial class MyDatabaseEntities : DbContext 
{ 
    public MyDatabaseEntities() 
     : base("name=MyDatabaseEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

    public virtual DbSet<MyTable> MyTable { get; set; } 
} 

risposta

7

Che ne dite:

public partial class MyDatabaseEntities : DbContext 
{ 
public MyDatabaseEntities(string connectionString) 
    : base(connectionString) 
{ 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    throw new UnintentionalCodeFirstException(); 
} 

public virtual DbSet<MyTable> MyTable { get; set; } 

}

Then inizializzare il database di come avete fatto prima:

string myConnectionString = "..."; 
MyDatabaseEntities = new MyDatabaseEntities(myConnectionString); 
+1

non ero a conoscenza che la stringa alla base() è stato la stringa di connessione. Grazie, l'ha fatto. – FNR

+0

Sì, prova a trovare la connectiontring con il nome specificato tra parentesi nel file di configurazione del progetto di avvio –

+0

Ho impostato la connessione stirng come questa: string connection = @ "metadata = res: //*/ShopModel.csdl | res: //*/ShopModel.ssdl | res: //*/ShopModel.msl; provider = System.Data.SqlClient; provider connection string = " origine dati = SIPL35 \ SQL2016; catalogo iniziale = Join8ShopDB2; id utente = Sa; password = Sa123! @ #; MultipleActiveResultSets = True; App = EntityFramework " "; Join8ShopDBEntities dbContext = new Join8ShopDBEntities (connessione); ma mi sta dando un'eccezione non identificata per la sorgente di dati sorgente –

2

ho ottenuto questa soluzione usando sotto il codice, posso hardcode stringa di connessione utilizzando il codice C# senza l'utilizzo di file di configurazione.

public class SingleConnection 
    { 
     private SingleConnection() { } 
     private static SingleConnection _ConsString = null; 
     private String _String = null; 

     public static string ConString 
     { 
      get 
      { 
       if (_ConsString == null) 
       { 
        _ConsString = new SingleConnection { _String = SingleConnection.Connect() }; 
        return _ConsString._String; 
       } 
       else 
        return _ConsString._String; 
      } 
     } 

     public static string Connect() 
     { 
      //Build an SQL connection string 
      SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder() 
      { 
       DataSource = "SIPL35\\SQL2016".ToString(), // Server name 
       InitialCatalog = "Join8ShopDB", //Database 
       UserID = "Sa",   //Username 
       Password = "[email protected]#", //Password 
      }; 
      //Build an Entity Framework connection string 
      EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder() 
      { 
       Provider = "System.Data.SqlClient", 
       Metadata = "res://*/ShopModel.csdl|res://*/ShopModel.ssdl|res://*/ShopModel.msl", 
       ProviderConnectionString = @"data source=SIPL35\SQL2016;initial catalog=Join8ShopDB2;user id=Sa;[email protected]#;"// sqlString.ToString() 
      }; 
      return entityString.ConnectionString; 
     } 

e utilizzando DbContext utilizza in questo modo:

Join8ShopDBEntities dbContext = new Join8ShopDBEntities(SingleConnection.ConString); 
0

ho avuto il problema simile. My Edmx e App.Config erano in un progetto diverso. Il mio progetto di avvio era diverso, aveva 3 diverse stringhe di connessione, abbiamo bisogno di sceglierne uno al volo a seconda dell'ambiente. Quindi non poteva usare una stringa di connessione fissa. Ho creato un sovraccarico di classe parziale di Context.cs utilizzando lo stesso spazio dei nomi. Di seguito è stato il mio default Context.cs;

namespace CW.Repository.DBModel 
{ 

    public partial class CWEntities : DbContext 
    { 
     public CWEntities() 
     : base("name=CWEntities") 
     { 
     } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
     throw new UnintentionalCodeFirstException(); 
     } 
    ... 
    ... 
    } 
} 

Il mio sovraccarico parziale di classe;

Infine, poiché le stringhe di connessione non erano per EF, le ho convertite in una stringa di connessione EF.

public static string GetEntityConnectionString(string connectionString) 
    { 
     var entityBuilder = new EntityConnectionStringBuilder(); 

     // WARNING 
     // Check app config and set the appropriate DBModel 
     entityBuilder.Provider = "System.Data.SqlClient"; 
     entityBuilder.ProviderConnectionString = connectionString + ";MultipleActiveResultSets=True;App=EntityFramework;"; 
     entityBuilder.Metadata = @"res://*/DBModel.CWDB.csdl|res://*/DBModel.CWDB.ssdl|res://*/DBModel.CWDB.msl"; 

     return entityBuilder.ToString(); 
    } 

Infine, la chiamando

var Entity = new CWEntities(CWUtilities.GetEntityConnectionString(ConnectionString)); 
Problemi correlati