2011-03-23 14 views
5

Estoy creando una aplicación web Asp.Net MVC 3 de múltiples usuarios y utilizando primero el código EF4.1 para el modelo db.Primero en el código EF4.1, cómo anular el nombre de ConnectionString en Web.config

Para el desarrollo estoy feliz de usar SqlServerCe en App_Data, y para la producción Esto moverá a SQL Server 2008.

decir que mi contexto se llama "MyModels", por la apariencia de código de primer defecto para una cadena de conexión llamado "MyModels" en Web.config. Se puede decir que use un archivo en App_Data o que se cambie para acceder a una base de datos en SQL2008. Todo bien hasta ahora.

Pero debido al multi-tenancy, me gustaría que el nombre de archivo SqlServerCE coincida con el ID único del inquilino (por lo que App_Data tendría "client_x.sdf", "client_y.sdf"; Sql Server 2008 tendría bases de datos separadas) No puedo resolver cómo dirigirme a estas diferentes bases de datos.

He intentado MyModels heredar de DbContext y suministrar una cadena de conexión (usando una cadena de conexión 'placeholder' en Web.config y reemplazando "{clientId}" con la identificación única), y también he intentado configurar el cadena de conexión en el constructor MyModels:

base.Database.Connection.ConnectionString = xxx; 

pero esto parece que nunca funciona. Siempre sale el siguiente error:

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)

(Esto sugiere que no es todavía 'configurar' para utilizar SqlServerCe, y así está intentando conectarse a SQL Server que pienso.!)

rastreo del código, Base de Datos .Connection.ConnectionString no se ha leído desde Web.config en este punto, por lo que no puedo buscar y reemplazar eso, y, posiblemente, se sobreescriba por la cadena de conexión 'placeholder' más adelante en la tubería.

Creo que esto debe ser bastante sencillo y no puedo encontrar el 'gancho'. Alguien puede ayudarme porfavor?

+0

Lo he descubierto, y es porque soy un poco tonto. ¡Lo siento! Solo estaba tratando de establecer ConnectionString para ser el connectionString de Web.config, pero realmente necesito construirlo usando el DbConnectionStringBuilder. Si reemplazo la propiedad ConnectionString del constructor, entonces use el constructor para establecer la cadena conn de EF, funciona. ¡Podría hacerlo marcando esto como resuelto, por favor! –

+3

Escribe el contenido de tu comentario como respuesta y acéptalo. –

+0

Como dice Ladislav Mrnka, está perfectamente bien responder su propia pregunta.Creo que tienes que esperar un día o dos antes de que puedas marcar tu propia respuesta como "la", pero está permitida;) –

Respuesta

1

Lo he descubierto, y es porque soy un poco tonto. ¡Lo siento! Solo estaba tratando de establecer ConnectionString para ser el connectionString de Web.config, pero realmente necesito construirlo usando el DbConnectionStringBuilder. Si reemplazo la propiedad ConnectionString del constructor, entonces use el constructor para establecer la cadena conn de EF, funciona.

+2

Recibo los mismos errores. Un poco de código que muestra qué parte hace que la cadena web.config y cómo configurarla sería de MUCHA ayuda para mí. – jp2code

1

No estoy seguro si es un posible enfoque para resolver su problema. Mi idea es crear una clase estática de "fábrica" ​​para instanciar tu clase DbContext. El código es así:

public static class MyModelsFactory 
{ 
    public static MyModels CreateMyModels() 
    { 
     string connectionString = string.Empty; 
     // some code to retrieve your connectionString. 
     return new MyModels(connectionString); 
    } 
} 

Y usted puede llamar CreateMyModels método siempre que se necesite para crear instancias de la clase MyModels:

using (MyModels models = MyModelsFactory.CreateMyModels()) 
{ 
    //your code 
} 

Funciona para mí en el caso de que necesite cambiar la cadena de conexión de acuerdo con la algo de lógica en tiempo de ejecución. Pero mi clase DbContext se genera automáticamente por EF clásico, no por código primero.

Cuestiones relacionadas