Principales respuestas
¿Una mejor forma de manejar las cadenas de conexión?

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="data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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="data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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="data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" 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="data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" 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="data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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="data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" 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="data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" 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="data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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="data source=HP-PC\SQLEXPRESS;initial catalog=MEGABLOCK_1;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" 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?
Respuestas
-
pero me dio el error que me intentaba traer informacion de todas las tablas cuando le estaba pidiendo solo una
- Marcado como respuesta Jose Miguel Galdamez Madrid viernes, 15 de febrero de 2019 17:00
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.
-
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
-
pero me dio el error que me intentaba traer informacion de todas las tablas cuando le estaba pidiendo solo una
- Marcado como respuesta Jose Miguel Galdamez Madrid viernes, 15 de febrero de 2019 17:00
-
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 -
>>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 -
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?
-
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 -
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
ArgentinaAh 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?
-
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