2011-01-26 13 views
63

¿Cómo paso una cadena de conexión al primer código de la entidad DbContext? La generación de mi base de datos funciona correctamente cuando tanto DbContext como la cadena de conexión en web.config están en el mismo proyecto y se nombran de la misma manera. Pero ahora tengo que mover el DbContext a otro proyecto, de modo que estoy probando pasando una cadena de conexión a la misma de la siguiente manera:Pasar la cadena de conexión a primer código DbContext

Modelo & Contexto

public class Dinner 
{ 
    public int DinnerId { get; set; } 
    public string Title { get; set; } 
} 

public class NerdDinners : DbContext 
{ 
    public NerdDinners(string connString) 
     : base(connString) 
    { 
    } 
    public DbSet<Dinner> Dinners { get; set; } 
} 

Acción

public ActionResult Index() 
    { 
     var db = new NerdDinners(ConfigurationManager.ConnectionStrings["NerdDinnerDb"].ConnectionString); 

     var dinners = (from d in db.Dinners 
         select d).ToList(); 
     return View(dinners); 
    } 

Web.Config

<connectionStrings> 
    <add name="NerdDinnerDb" connectionString="Data Source=|DataDirectory|NerdDinners.sdf" providerName="System.Data.SqlServerCe.4.0"/>  
</connectionStrings> 

Si configuro un punto de interrupción en la acción y analizo db, la cadena de conexión está ahí, pero no crea ni encuentra la base de datos ni nada.

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

+0

¿Está absolutamente seguro de que se está conectando al servidor correcto? El error es una excepción típica de SQL Server/Express. No suena como si estuvieras conectado a una base de datos Sql CE ... y el Código EF primero creará la base de datos si no existe ... a menos que la ruta no se encuentre quizás ... –

Respuesta

54

Después de leer la documentación, tengo que pasar el nombre de la cadena de conexión en su lugar:

var db = new NerdDinners("NerdDinnerDb"); 
+0

Puse eso en mi constructor y lo convertí en una constante pública en caso de que fuera necesario para referencia en otro lugar. –

1

Compruebe la sintaxis de su cadena de conexión en web.config. Debería ser algo así como ConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"

+0

La cadena de conexión funciona cuando ambos usan el mismo nombre en el mismo proyecto. –

+0

No funciona cuando quiero pasarlo manualmente a DbConext –

+0

La cadena de conexión está bien, la ruta no necesita ser absoluta. –

1

Al usar un modelo EF, tengo una cadena de conexión en cada proyecto que consume el modelo EF. Por ejemplo, tengo un modelo EF EDMX en una biblioteca de clases separada. Tengo una cadena de conexión en mi proyecto web (mvc) para que pueda acceder al db EF.

También tengo otro proyecto de prueba de unidad para probar los repositorios. Para que los repositorios accedan al EF db, el archivo app.config del proyecto de prueba tiene la misma cadena de conexión.

Las conexiones de DB deben configurarse, no codificarse, IMO.

+2

Necesito pasar manualmente la cadena de conexión por código. Estoy usando inyección de dependencia. –

0

No se puede ver nada incorrecto con su código, yo uso SqlExpress y funciona bien cuando uso una cadena de conexión en el constructor.

Ha creado una carpeta App_Data en su proyecto, ¿o no?

1

Si usted está construyendo la cadena de conexión dentro de la aplicación, entonces sería utilizar el mando de connString. Si está utilizando una cadena de conexión en la configuración web. Luego usas el "nombre" de esa cadena.

36

Pensé en agregar este bit para las personas que buscan "Cómo pasar una cadena de conexión a un DbContext": Puede construir una cadena de conexión para su almacén de datos subyacente y pasar toda la cadena de conexión al constructor de su tipo derivado de DbContext.

(Reutilización de Código de @Lol Coder) Modelo & Contexto

public class Dinner 
{ 
    public int DinnerId { get; set; } 
    public string Title { get; set; } 
} 

public class NerdDinners : DbContext 
{ 
    public NerdDinners(string connString) 
     : base(connString) 
    { 
    } 
    public DbSet<Dinner> Dinners { get; set; } 
} 

Entonces, dicen que la construcción de una cadena de conexión de SQL utilizando el SqlConnectioStringBuilder así:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString()); 

Dónde el método GetConnectionString construye la cadena de conexión apropiada y SqlConnectionStringBuilder asegura que la cadena de conexión sea sintácticamente correcta; a continuación, puede instancia su conetxt db así:

var myContext = new NerdDinners(builder.ToString()); 
+4

Para codificar realmente la cadena de conexión que hice: 'public TestAppContext(): base (" Data Source = server.company.com; Initial Catalog = SomeDB; Integrated Security = True ") {}' –

59

Un poco tarde al juego aquí, pero otra opción es:

public class NerdDinners : DbContext 
{ 
    public NerdDinners(string connString) 
    { 
     this.Database.Connection.ConnectionString = connString; 
    } 
    public DbSet<Dinner> Dinners { get; set; } 
} 
+2

¡Hola! Esta fue la única solución que me consiguió en alguna parte. Mi problema es que me gustaría tomar la configuración de mi archivo de configuración de Azure en lugar de web.config. Aún así, de esta manera no funciona ya que falta la configuración 'Proveedor' (se establece como un atributo en el web.config). ¿Algunas ideas? – user

+1

¡Excelente respuesta! El único cambio realizado fue eliminar el parámetro connString y luego usar la cadena de conexión guardada en la configuración de la aplicación .... this.Database.Connection.ConnectionString = Properties.Settings.Default.ConnectionString – usefulBee

+0

¿Cómo puedo pasar los objetos connString y DbCompiledModel? al mismo tiempo como parámetro? –

20

En su DbContext, crea un constructor por defecto para su DbContext y heredar la base como esta:

public myDbContext() 
     : base("MyConnectionString") // connectionstring name define in your web.config 
    { 
    } 
Cuestiones relacionadas