none
como modificar la conexion de dbContext EF dinamicamente RRS feed

  • Pregunta

  • tengo un requerimiento que me piden que traiga del web config las conexiones a las bases de datos, y de esta lista selecciones a la que se debe conectar, eso en el lado del front ya lo realizo y envio el name de la conexion a una web api, hasta ahi va bien el problema es que como llega a un endpoint solo se modifica de manera local, como debo hacer para que se modifique de manera global ese valor.

    private skytexSettingApp db = new skytexSettingApp();// o como pasar aqui el valor que seleccione 

         [Route("api/DBConnections/{name}")]
            [HttpPost]
            public void DBConnectionsName(string name)
            {


                
                skytexSettingApp db = new skytexSettingApp(name); //aqui en el name le paso el nombre de la conexion que seleccione
       

            }
       

    miércoles, 5 de septiembre de 2018 23:57

Respuestas

  • Fíjate en donde haces

    skytexSettingApp db = new skytexSettingApp();

    Ahí entre los paréntesis tienes que pasarle la conexión deseada, y esto hay que hacerlo en TODOS los sitios donde hagas un "new" del dbContext, no se puede cambiar "globalmente". Podrías conservarlo en el Session (o el Application, si es global para todos los usuarios), y seleccionarlo cada vez:

    skytexSettingApp db = new skytexSettingApp(Session["conexionSeleccionada"] as string);

    Obviamente, en el Post del DBConnectionsName guardarías la conexión dentro del Session.

    jueves, 6 de septiembre de 2018 6:18
    Moderador
  • hola

    seria

    private skytexSettingApp db = null;

    public void DBConnectionsName(string name){

    Session["name"] = name; db = new skytexSettingApp(name); }

    asignas a la session el name que te llega al action

    asi podras usarlo luego

    string name = Session["name"].ToString();
    saludos

    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Erick Mociño jueves, 6 de septiembre de 2018 18:29
    jueves, 6 de septiembre de 2018 16:17
  • Normalmente, si escribes el código dentro de un controlador, Session es una propiedad heredada de la clase madre Controller. Ojo, no existe si es un ApiController en lugar de Controller.

    Si lo quieres usar desde otro sitio distinto del controlador, puedes usar System.Web.HttpContex.Current.Session (tras agregar la pertinente Referencia en el proyecto si es que no la tiene ya). Pero solo funciona si se consulta desde dentro del contexto de una llamada a un controlador (o un webform). Por ejemplo, si lo haces desde un WebApi no existe Session (porque no genera ni transmite la cookie de sesión que antes habíamos mencionado).

    • Marcado como respuesta Erick Mociño jueves, 6 de septiembre de 2018 20:44
    jueves, 6 de septiembre de 2018 19:09
    Moderador

Todas las respuestas

  • Fíjate en donde haces

    skytexSettingApp db = new skytexSettingApp();

    Ahí entre los paréntesis tienes que pasarle la conexión deseada, y esto hay que hacerlo en TODOS los sitios donde hagas un "new" del dbContext, no se puede cambiar "globalmente". Podrías conservarlo en el Session (o el Application, si es global para todos los usuarios), y seleccionarlo cada vez:

    skytexSettingApp db = new skytexSettingApp(Session["conexionSeleccionada"] as string);

    Obviamente, en el Post del DBConnectionsName guardarías la conexión dentro del Session.

    jueves, 6 de septiembre de 2018 6:18
    Moderador
  • hola

    seria

    private skytexSettingApp db = null;

    public void DBConnectionsName(string name){

    Session["name"] = name; db = new skytexSettingApp(name); }

    asignas a la session el name que te llega al action

    asi podras usarlo luego

    string name = Session["name"].ToString();
    saludos

    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Erick Mociño jueves, 6 de septiembre de 2018 18:29
    jueves, 6 de septiembre de 2018 16:17
  • de hecho es lo que opte por hacer pasarle la conexion cada que llamo mi db, lo realizo asi:

    [ResponseType(typeof(rtt_core_Application_Settings))]
            [Route("api/ConfiguracionesObtener/{id}")]
            [HttpGet]
            public IHttpActionResult Getrtt_Application_Settings(int id,string connection)
            {
                db = new skytexSettingApp(connection); estoy instanciando cada vez que me encuentro con un db 
                rtt_core_Application_Settings rtt_core_Application_Settings = db.rtt_core_Application_Settings.Find(id);

                if (rtt_core_Application_Settings == null)
                {
                    return NotFound();
                }

                return Ok(rtt_core_Application_Settings);
            }

    Podrías conservarlo en el Session (o el Application, si es global para todos los usuarios), y seleccionarlo cada vez:

    llevo poco tiempo desarrollando en c# , como haria lo da la session?, porque la primera opcion ya lo tengo pero me implico realizar cambios en el front, el front lo realize con angular 6, y tambien me implica realizar cambios en el api

    de antemano muchas gracias por la respuesta.

    jueves, 6 de septiembre de 2018 16:29
  • como harialo da la session?, porque la primera opcionya lo tengo pero me implico realizar cambios en el front

    La sesion no implica cambios en el front, se maneja íntegramente en lado servidor, y funciona gracias a una Cookie de Sesion que se genera automáticamente y el cliente reenvía automáticamente en cada llamada, sin necesidad de cambiar nada en el front.

    Para salvar algo en el Session se usa

    Session["clave"]=valor;

    y para recuperarlo se usa

    variale=(Tipo)Session["clave"];

    La "clave" puede ser cualquier nombre que quieras usar para distinguir ese valor de cualquier otra cosa que hayas salvado en el Session, que tendría otra clave distinta.

    El tipo puede ser string si quieres salvar una cadena de conexión, pero también se pueden salvar otros tipos tales como int en el Session si es que lo necesitas.

    jueves, 6 de septiembre de 2018 17:54
    Moderador
  • una pregunta me muestra un error que me dice 'El nombre Session' no existe el contexto actual busque e intente con:

    HttpContext.Current.Session

    pero la sesion me la regresa null donde debería declarar Session por que la referencia System.Web.UI ya la tengo algo me falta? agradecería mucho su consejo 



    jueves, 6 de septiembre de 2018 18:48
  • Normalmente, si escribes el código dentro de un controlador, Session es una propiedad heredada de la clase madre Controller. Ojo, no existe si es un ApiController en lugar de Controller.

    Si lo quieres usar desde otro sitio distinto del controlador, puedes usar System.Web.HttpContex.Current.Session (tras agregar la pertinente Referencia en el proyecto si es que no la tiene ya). Pero solo funciona si se consulta desde dentro del contexto de una llamada a un controlador (o un webform). Por ejemplo, si lo haces desde un WebApi no existe Session (porque no genera ni transmite la cookie de sesión que antes habíamos mencionado).

    • Marcado como respuesta Erick Mociño jueves, 6 de septiembre de 2018 20:44
    jueves, 6 de septiembre de 2018 19:09
    Moderador
  • si es un web Api entonces cada que necesite usar mi db, tendre que instanciarlo y pasarle el name de la conexion, saludos y muchas gracias

    jueves, 6 de septiembre de 2018 21:03
  • si opte por utilizar en mi front con angular el localstorage y ahi guardar el nombre de mi conexion y mandarla al api, e instanciarla cada que entro a un endpoint saludos gracias a todos por su ayuda
    jueves, 20 de septiembre de 2018 22:47