2010-07-10 11 views
6

Ho recentemente iniziato a utilizzare la libreria Solo codice EF v4 per alcuni progetti su cui sto lavorando. Tuttavia, ho incontrato un po 'di intoppo. Non riesco a capire il formato corretto per la stringa di connessione. Ho usato il seguente codice per costruire la stringa di connessione:Entity Framework v4 Stringa di connessione con solo codice

string connectionString = new EntityConnectionStringBuilder 
{ 
    Provider = "System.Data.SqlClient", 
    ProviderConnectionString = new SqlConnectionStringBuilder 
    { 
     DataSource = "localhost", 
     InitialCatalog = "ASM_Testing", 
     IntegratedSecurity = true, 
     Pooling = false 
    }.ConnectionString 
}.ConnectionString; 

Tuttavia, utilizzando il risultato e 'il seguente errore:

Specifications_for_EntityContext.When_logging_in_application_with_valid_app_role_and_password.Login_should_be_successful : System.ArgumentException : Some required information is missing from the connection string. The 'metadata' keyword is always required. 
Stack Trace: 
    at System.Data.EntityClient.EntityConnection.ValidateValueForTheKeyword(DbConnectionOptions effectiveConnectionOptions, String keywordName) 
    at System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString) 
    at System.Data.Objects.ObjectContext..ctor(String connectionString) 
    at ASM.Data.EntityContext..ctor(String connectionString) in C:\Users\Jon Rista\TFS\Advanced Service Management\Trunk\Main\Source\ASM.Data\EntityContext.cs:line 16 
    at Specifications_for_EntityContext.Behaves_like_EntityContext_connected_to_a_database.TestableEntityContext..ctor(String connectionString) in C:\Users\Jon Rista\TFS\Advanced Service Management\Trunk\Main\Source\Tests.ASM.Data\EntityContextFacts.cs:line 165 
    at Specifications_for_EntityContext.Behaves_like_EntityContext_connected_to_a_database.InitializeContext() in C:\Users\Jon Rista\TFS\Advanced Service Management\Trunk\Main\Source\Tests.ASM.Data\EntityContextFacts.cs`e`enter code here`nter code here`:line 160 
    at ASM.Testing.xUnit.ObservationCommand.Execute(Object testClass) in C:\Users\Jon Rista\TFS\Advanced Service Management\Trunk\Main\Source\ASM.Testing.xUnit\ObservationCommand.cs:line 24 
    at Xunit.Sdk.FixtureCommand.Execute(Object testClass) 
    at Xunit.Sdk.BeforeAfterCommand.Execute(Object testClass) 
    at Xunit.Sdk.LifetimeCommand.Execute(Object testClass) 
    at Xunit.Sdk.TimedCommand.Execute(Object testClass) 
    at Xunit.Sdk.ExceptionAndOutputCaptureCommand.Execute(Object testClass) 

Visto che non ho tutti i metadati ... da quando ho sto usando solo il codice, sono un po 'in difficoltà. Qualsiasi consiglio é ben accetto.

La stringa di connessione generato dalle classi di build è la seguente:

provider=System.Data.SqlClient;provider connection string="Data Source=localhost;Initial Catalog=ASM_Testing;Integrated Security=True;Pooling=False"


Esempio di lavoro (sulla base di risposte accettate)

E 'necessario utilizzare il ContextBuilder per creare qualsiasi istanza di un contesto che utilizza una modalità solo codice. Ecco un esempio di lavoro di questo per coloro che sono alla ricerca di una risposta allo stesso problema:

protected override void InitializeContext() 
{ 
    string connectionString = new SqlConnectionStringBuilder 
    { 
     DataSource = "localhost", 
     InitialCatalog = "Testing", 
     IntegratedSecurity = true, 
     Pooling = false 
    }.ConnectionString; 

    var connection = new SqlConnection(connectionString); 
    var builder = new ContextBuilder<TestableEntityContext>(); 
    m_context = builder.Create(connection); 
} 
+0

puoi pubblicare la stringa risultante? Oppure esplode già durante l'esecuzione di questo codice? –

+0

@Henk: aggiunta la stringa di connessione. – jrista

risposta

4

Per utilizzarlo:

var builder = new ContextBuilder<YourContext>(); 

using (YourContext context = builder.Create(new SqlConnection(ConfigurationManager.ConnectionStrings["yourConenctionKeyInWebConfig"].ConnectionString))) 
{ 
    ... 
} 
+0

Grazie. Sapevo di ContextBuilder, ma non mi è venuto in mente di usarlo nei miei test unitari per la mia classe EntityContext. Penso che questo risolva il problema comunque. Grazie! – jrista

3

Per quanto mi pare di capire utilizzando il codice unico approccio non è possibile creare un'istanza contesto semplicemente passando stringa di connessione DB alla sua ctor. Normalmente useresti ContextBuilder per creare il tuo contesto.

  1. Definire ctor prendendo EntityConnection in EntityContext classe

    pubblico EntityContext (collegamento EntityConnection): base (connessione) {}

  2. Crea collegamento

    var fabbrica = DbProviderFactories.GetFactory ("System.Data.SqlClient"); var connection = factory.CreateConnection(); connection.ConnectionString = providerConnectionString;

  3. Usa ContextBuilder per creare nuovo contesto

    var contextBuilder = new ContextBuilder(); contextBuilder.Configurations.Add (...) var context = contextBuilder.Create (connection);

+0

+1 Ottima risposta. Ho letto la prima di Gregoire e l'ho contrassegnata come accettata. Entrambi hanno risposto alla mia domanda, però. Grazie! – jrista

Problemi correlati