2010-07-10 17 views
6

Recientemente he comenzado a utilizar la biblioteca EF v4 Code Only para algunos proyectos en los que estoy trabajando. Sin embargo, me he topado con un pequeño inconveniente. Parece que no puedo encontrar el formato adecuado para la cadena de conexión. He utilizado el código siguiente para construir la cadena de conexión:Entity Framework v4 Cadena de conexión solo de código

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

Sin embargo, usando el resultado es el siguiente error:

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) 

En vista de que no tengo ninguna metadatos ... desde que estoy usando Code Only, estoy en un aprieto. Cualquier idea es muy apreciada.

La cadena de conexión generada por las clases constructoras es el siguiente:

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


Ejemplo de trabajo (basado en las respuestas aceptadas)

Es necesario utilizar el ContextBuilder para crear cualquier instancia de un contexto que utiliza un modo de solo código. Aquí está un ejemplo práctico de esto para los que están en busca de una respuesta al mismo 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

Se puede publicar la cadena resultante? ¿O ya explota al ejecutar este código? –

+0

@Henk: se agregó la cadena de conexión. – jrista

Respuesta

4

Para usarlo:

var builder = new ContextBuilder<YourContext>(); 

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

Gracias. Sabía sobre ContextBuilder, pero no se me pasó por la mente usarlo en mis pruebas unitarias para mi clase EntityContext. Creo que esto resolverá el problema sin embargo. ¡Gracias! – jrista

3

Por lo que yo entiendo el uso de código único enfoque no se puede crear una instancia de contexto simplemente pasando cadena de conexión de base de datos para su ctor. Normalmente, usaría ContextBuilder para crear su contexto.

  1. Definir ctor teniendo en EntityConnectionEntityContext clase

    pública EntityContext (conexión EntityConnection): base (conexión) {}

  2. Crear conexión

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

  3. Uso ContextBuilder para crear nuevo contexto

    var contextBuilder = new ContextBuilder(); contextBuilder.Configurations.Add (...) var context = contextBuilder.Create (conexión);

+0

+1 Gran respuesta. Leí el primero de Gregoire y lo marqué como aceptado. Ambos respondieron mi pregunta, sin embargo. ¡Gracias! – jrista

Cuestiones relacionadas