Cómo obtener ConnectionString desde EF7 DbContext

asp.net-core asp.net-core-mvc c# entity-framework-core

Pregunta

Mi Escenario:

Estoy usando EF7 para operaciones CRUD estándar y Dapper para consultas más complejas que requieren un aumento de la velocidad. Desde startup.cs estoy inyectando mi DbContext en mi DAL que obviamente hace las consultas de la base de datos. Dapper requiere una cadena de conexión. Quiero inyectar mi cadena de conexión EF7 DbContext en la consulta Dapper.

Mi pregunta:

¿Cómo obtengo la cadena de conexión de DbContext como antes: DbContext.Database.Connection ?

Cambió de la Database de Database al tipo DatabaseFacade en EF7, y con eso, también se eliminó la DbConnection Connection .

¿Seguramente debería haber alguna cadena de conexión persistente en el DbContext que pueda consultar?

Mi investigación:

El método que estoy usando en este momento es, y funciona:

public partial class CustomContext : DbContext
{
    public readonly string _connectionString;

    public CustomContext (DbContextOptions options)
        : base(options)
    {
            _connectionString = ((SqlServerOptionsExtension)options.Extensions.First()).ConnectionString;
    }
}

Sé que todavía está en beta, pero ¿me estoy perdiendo algo?

Gracias por tu tiempo.

Respuesta aceptada

He buscado en las fuentes EF7 y parece que estás en lo correcto con tu enfoque actual.

La cadena de conexión se almacena en SqlServerOptionsExtension . Cuando llama a UseSqlServer(connectionString) el código es el siguiente (solo se extraen líneas interesantes):

var extension = options.FindExtension<SqlServerOptionsExtension>()
extension.ConnectionString = connectionString;

No estoy seguro de por qué se eliminó la cadena de conexión del lugar obvio, pero puede ser que los desarrolladores extrajeron la cadena de conexión para permitirnos utilizar bases de datos no estándar (como bases de datos en memoria, etc.).

Esto se ve mucho más claro IMO:

var extension = options.FindExtension<SqlServerOptionsExtension>()
extension.ConnectionString = connectionString;

Respuesta popular

Si tiene un contexto completamente materializado, también puede usar esto:

 var conn = context.Database.GetDbConnection();
 ConnectionString = conn?.ConnectionString;
 conn?.Dispose();



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué