the net how framework discovers change and c# entity-framework database-connection

c# - net - dbcontext scaffold connection string



Pase cadena de conexión a primer código DbContext (9)

¿Cómo paso una cadena de conexión al DbContext de primer código de la entidad? 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 necesito mover el DbContext a otro proyecto, así que estoy probando pasarle una cadena de conexión de la siguiente manera:

Modelo y 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 establezco un punto de interrupción en la acción y analizo el db , la cadena de conexión está ahí, pero no crea ni encuentra la base de datos ni nada.

Se ha producido un error relacionado con la red o específico de la instancia al establecer una conexión con SQL Server. El servidor no se encontró o no estaba accesible. Verifique que el nombre de la instancia sea correcto y que SQL Server esté configurado para permitir conexiones remotas. (proveedor: Proveedor de canalizaciones con nombre, error: 40 - No se pudo abrir una conexión a SQL Server)


Cuando utilizo 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 DB deben ser configuradas, no codificadas, IMO.


Después de leer los documentos, debo pasar el nombre de la cadena de conexión en su lugar:

var db = new NerdDinners("NerdDinnerDb");


En su DbContext, cree un constructor predeterminado para su DbContext y herede la base de esta manera:

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


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

Ha creado una carpeta App_Data en su proyecto, ¿verdad?


Pensé que agregaría 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 .

(Código de reutilización de @Lol Coder) Modelo y 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; } }

Luego, supongamos que construyes una cadena de conexión Sql usando SqlConnectioStringBuilder así:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());

Donde el método GetConnectionString construye la cadena de conexión apropiada y el SqlConnectionStringBuilder asegura que la cadena de conexión sea sintácticamente correcta; entonces puedes crear una instancia de tu db conetxt así:

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


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


Tengo un pequeño ejemplo de solución para ese problema.

MyDBContext.cs

public MyDBContext(DBConnectionType ConnectionType) //: base("ConnMain") { if(ConnectionType==DBConnectionType.MainConnection) { this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnMain"].ConnectionString; } else if(ConnectionType==DBConnectionType.BackupConnection) { this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnBackup"].ConnectionString; } }

MyClass.cs

public enum DBConnectionType { MainConnection=0, BackupConnection=1 }

frmMyForm.cs

MyDBContext db = new MyDBContext(DBConnectionType.MainConnection); //or //MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);


Un poco tarde para el 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; } }


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