none
¿Una mejor forma de manejar las cadenas de conexión? RRS feed

  • Pregunta

  • Tengo un serio dilema, hace unos días he comenzado con esto de la creación de APIs y estoy desarrollando una en Visual Studio con C#... el problema viene aquí.

    He visto varias guias y varios tutoriales que me explicaban como hacer una conexion a la base de datos desde la API a SQL Server a travez de una clase...

    En esa clase se hacen las entidades de datos de modelos por cada tabla que tengo! 

    entonces en el App.Config de esa clase poseo:

    <connectionStrings>
        <add name="UsuariosEntities" connectionString="metadata=res://*/UsuariosModel.csdl|res://*/UsuariosModel.ssdl|res://*/UsuariosModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
        <add name="RolesEntities" connectionString="metadata=res://*/RolesModel.csdl|res://*/RolesModel.ssdl|res://*/RolesModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
        <add name="StatusOrderEntities" connectionString="metadata=res://*/StatusOrderModel.csdl|res://*/StatusOrderModel.ssdl|res://*/StatusOrderModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
        <add name="PrdCategorieEntities" connectionString="metadata=res://*/PrdCategorieModel.csdl|res://*/PrdCategorieModel.ssdl|res://*/PrdCategorieModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
        <add name="InventoryEntities" connectionString="metadata=res://*/InventoryModel.csdl|res://*/InventoryModel.ssdl|res://*/InventoryModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
        <add name="OrderEntities" connectionString="metadata=res://*/OrderModel.csdl|res://*/OrderModel.ssdl|res://*/OrderModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
        <add name="ClientEntities" connectionString="metadata=res://*/ClientModel.csdl|res://*/ClientModel.ssdl|res://*/ClientModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
        <add name="DetailOrderEntities" connectionString="metadata=res://*/DetailOrderModel.csdl|res://*/DetailOrderModel.ssdl|res://*/DetailOrderModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
        <add name="PaymentEntities" connectionString="metadata=res://*/PaymentModel.csdl|res://*/PaymentModel.ssdl|res://*/PaymentModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
      </connectionStrings>

    que corresponden a las 9 cadenas de conexion para cada tabla que poseo. La situacion es que esto mismo tengo tambien en el Web.Config de mi proyecto principal.

    Mi proyecto puede crecer aun mas, pueda que se necesiten mas tablas en la base de datos y por ende me tocaria crear mas EntitiesDataModels para cada tabla y cuando llegue el momento de subir a un sitio mi API con una base de datos en otro servidor ME TOCARIA CONFIGURAR TODAS LAS CADENAS DE CONEXION Y VER QUE TODO FUNCIONE BIEN.

    Nose si ustedes Dios de la programacion me puedan ayudar diciendome como tengo que actuar aqui.

    Nota: Ya probé intenta que en el EntitieDataModel agregar todas las tablas pero solo me termina dando error esa cadena de conexion debido a que cuando ejecuto la aplicacion y espero que en el endpoint me devuelva el Json, el trata de regresarme un Json de TODAAA la aplicacion cuando le estoy pidiendo informacion de solo una tabla.

    ¿Existe alguna forma de que la cadena de conexion sea solo una para todo y que no me cause ese problema?

    viernes, 15 de febrero de 2019 15:14

Respuestas

  •  pero me dio el error que me intentaba traer informacion de todas las tablas cuando le estaba pidiendo solo una

    AHÍ es donde probablemente debe estar el problema. Habría que ver cóme le pides una tabla para ver por qué te traía información de todas. También habría que ver cómo construyes el DBContext, no vaya a ser que estés haciendo algo que habilite Eager Loading en lugar del Lazy Loading.
    viernes, 15 de febrero de 2019 16:11
    Moderador

Todas las respuestas

  • Tienes que estar haciendo algo raro. Todos nosotros usamos siempre una unica cadena de conexion para la base de datos, y a traves de esa unica cadena manejamos todas las tablas.

    Tambien veo en tu captura de pantalla que tienes un monton de .edmx. Normalmente se usa uno solo y se meten dentro todas sus tablas. Esto es importante si quieres que EF sea capaz de operar con las relaciones entre tablas.

    En el WebApi simplemente devuelves una de las tablas, y de forma predeterminada NO te deberia devolver nada de las tablas relacionadas, si esta configurado para Lazy Loading, que es el valor predeterminado. Solo te devuelve las relacionadas si pones un Include al construir la lista de objetos a devolver por el WebApi.

    viernes, 15 de febrero de 2019 15:35
    Moderador
  • Tienes que estar haciendo algo raro. Todos nosotros usamos siempre una unica cadena de conexion para la base de datos, y a traves de esa unica cadena manejamos todas las tablas.

    Tambien veo en tu captura de pantalla que tienes un monton de .edmx. Normalmente se usa uno solo y se meten dentro todas sus tablas. Esto es importante si quieres que EF sea capaz de operar con las relaciones entre tablas.

    En el WebApi simplemente devuelves una de las tablas, y de forma predeterminada NO te deberia devolver nada de las tablas relacionadas, si esta configurado para Lazy Loading, que es el valor predeterminado. Solo te devuelve las relacionadas si pones un Include al construir la lista de objetos a devolver por el WebApi.

    Muchas gracias por tu pronta respuesta, como te mencionaba e intentado agregar todas las tablas a un solo edmx, pero me dio el error que me intentaba traer informacion de todas las tablas cuando le estaba pidiendo solo una. 

    Si ustedes trabajan asi y no les da problemas es OBVIO que yo estoy haciendo algo mal jajaja 

    viernes, 15 de febrero de 2019 15:51
  •  pero me dio el error que me intentaba traer informacion de todas las tablas cuando le estaba pidiendo solo una

    AHÍ es donde probablemente debe estar el problema. Habría que ver cóme le pides una tabla para ver por qué te traía información de todas. También habría que ver cómo construyes el DBContext, no vaya a ser que estés haciendo algo que habilite Eager Loading en lugar del Lazy Loading.
    viernes, 15 de febrero de 2019 16:11
    Moderador
  • hola

    >>que corresponden a las 9 cadenas de conexion para cada tabla que poseo. La situacion es que esto mismo tengo tambien en el Web.Config de mi proyecto principal.

    porque ?

    como es que mapeas cada entidad de seguridad cuando esto ya viene implementado en asp.net Identity, no tinees que generar ningun edmx para estas clases

    Introduction to ASP.NET Identity

    las entidades estan en

    Microsoft.AspNet.Identity.EntityFramework

    no tiene que tener 9 conexiones, deverias estudias un poco mejor lo que has realizado

    >>Mi proyecto puede crecer aun mas, pueda que se necesiten mas tablas en la base de datos

    pero no creas un edmx por cada table, es un unido edmx para toda la db

    Ademas porque usas edmx, eso no se recomienda deberias usar Code First

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 15 de febrero de 2019 16:19
  • >>intentado agregar todas las tablas a un solo edmx, pero me dio el error que me intentaba traer informacion de todas las tablas cuando le estaba pidiendo solo una.

    what ? no evaluaste dejar de usar el edmx ?

    ten en cuanta que en entity framework core este ya no existe, no crees que es por algo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 15 de febrero de 2019 16:21
  •  pero me dio el error que me intentaba traer informacion de todas las tablas cuando le estaba pidiendo solo una

    AHÍ es donde probablemente debe estar el problema. Habría que ver cóme le pides una tabla para ver por qué te traía información de todas. También habría que ver cómo construyes el DBContext, no vaya a ser que estés haciendo algo que habilite Eager Loading en lugar del Lazy Loading.

    Te marco como respuesta porque gracias a lo que me dijiste se me ocurrio una forma de resolverlo.

    Antes lo tenia asi:

    [HttpGet]
            public IEnumerable<Pagos> get()
            {
                using(dbEntities pago = new dbEntities())
                {
                    return pago.Pagos.ToList();
                }
            }

    y lo resolvi asi:

    [HttpGet]
            public IEnumerable<Pagos> get()
            {
                using(dbEntities pago = new dbEntities())
                {
                    pago.Configuration.ProxyCreationEnabled = false;
                    return pago.Pagos.ToList();
                }
            }

    Pero me podrías decir si esto tendrá repercusiones? o si hay alguna manera de desabilitarlo globalmente para todo mi proyecto?

    viernes, 15 de febrero de 2019 17:03
  • hola

    >>Pero me podrías decir si esto tendrá repercusiones? o si hay alguna manera de desabilitarlo globalmente para todo mi proyecto?

    no veo que tinee que ver el codigo que publicas como respuesta con la pregunta que planteas

    Alli solo defines dos action pero eso no evita el tener muchos conections string en el config porque mapeas de forma incorrecta los objetos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 15 de febrero de 2019 17:27
  • hola

    >>Pero me podrías decir si esto tendrá repercusiones? o si hay alguna manera de desabilitarlo globalmente para todo mi proyecto?

    no veo que tinee que ver el codigo que publicas como respuesta con la pregunta que planteas

    Alli solo defines dos action pero eso no evita el tener muchos conections string en el config porque mapeas de forma incorrecta los objetos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Ah eso es muy facil, todo el problema comenzó porque intente agregar todas las tablas a un solo edmx. Cuando hacia la consulta para traer la información saltaba este problema

    El tipo 'ObjectContent`1' no pudo serializar el cuerpo de respuesta para el tipo de contenido 'application/json; charset=utf-8'

    y para resolverlo, en todas las consultas Get() le agrego 

    pago.Configuration.ProxyCreationEnabled = false;

    Con eso ya me resuelve el problema y me trae la información.

    Ahora retorno a la pregunta, habrá alguna repercusión por esa linea de código?

    y si no lo hay? puedo desabilitarlo globalmente?

    viernes, 15 de febrero de 2019 17:42
  • hola

    Ahora retorno a la pregunta, habrá alguna repercusión por esa linea de código?

    pero eso es un parche, NUNCA se devuelve la entidad de entity framework como repsuesta de un action de asp.net mvc, para eso existen las clase de Model

    debes crear una clase que retornas del Get() y mapearla la repsuesta de EF a esa clase, puedes hacerlo con el mismo Select() de linq o sino con la ayuda de la libreria automapper

    pero NUNCA retornes una entidad de persistencia

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 15 de febrero de 2019 19:45