none
Cargar Datos Desde Otra Base de Datos RRS feed

  • Pregunta

  • Saludos,  tengo una base de datos Llamada AAAWeb , la cual contiene tablas y procedimientos almacenados, estas tablas almacenan diversos datos,  pero para acceder a la aplicación, he generado un SP, que me hace la comprobación de usr y pass de una tabla que esta en una base de datos Llamada BBBWEB, el problema que al generar el modelo en entity framework no se como hacerlo, para que me tome a su vez la(s) tabla(s) de la otra base de datos(BBBWEB),  en el SSMS, funciona super bien, pero como indico a la hora de generar el modelo en MVC, no toma estos SP, es decir no entregan Nada.

    espero haberme expresado bien, alguien me podría indicar algún tutorial de como hacer esto?? o prestar alguna ayuda????

    Gracias

    martes, 29 de diciembre de 2020 0:01

Respuestas

  • Saludos,  solucione, la situación,  Elimine los 2 modelos, limpie todas las referencias a el y los modelos anteriores,  después hice una limpieza del sistema a través de la opción limpiar,  re conecte los modelo con Usr y Password y todo funciono perfectamente.

    Gracias, por la paciencia.

    • Marcado como respuesta Rodrigo Menares miércoles, 30 de diciembre de 2020 15:24
    miércoles, 30 de diciembre de 2020 15:24

Todas las respuestas

  • No, Entity Framework no sabe combinar dos bases de datos en un único modelo. Tendrías que usar dos .edmx distintos, cada uno de ellos apuntado a una base de datos diferente.

    Desde SSMS, como ya has descubierto, no hay problema en trabajar con dos bases de datos a la vez, y se puede referenciar una desde la otra usando un nombre de tres partes. Pero EF no "entiende" estas referencias; los modelos que te genera solo se pueden generar desde una única base de datos. Lo que sí puedes hacer es tener dos datacontexts (generados a partir de dos .edmx distintos, si es que usas database-first) y luego acceder a cada base de datos a través de su correspondiente datacontext. Pero los generadores de código de MVC solo te lo generan a partir de un único datacontext. Si necesitases acceder a los dos desde un único controlador, tendrías que escribir manualmente el código para acceder al segundo. Las herramientas no saben agregarlo de forma automática.

    martes, 29 de diciembre de 2020 10:03
  • Ya, Gracias,  Logre agregar los 2 modelos , con las tablas que necesitaba,  y me reconoce los campos devueltos por los SP pero, ahora se me presenta la situación que el llamado a las sp no me reconoce el  ".FirstOrDefault()" al hacer la llamada. y Tampoco los ".ToList()" al tratar de cargar los combos.

    algún tutorial que me guie????,  Gracias..


    martes, 29 de diciembre de 2020 12:16
  • Tanto el .FirstOrDefaulr como el .ToList son extensores sobre IEnumerable o IQueryable. Cerciórate de que los estás aplicando sobre un objeto de estos tipos, y no sobre un resultado individual (un único registro). Examina con la F12 en Visual Studio el tipo del dato sobre el que estás tratando de aplicar estos extensores, para asegurarte de que es el tipo correcto.
    martes, 29 de diciembre de 2020 12:38
  • si, ambos son , por un lado esto:

    var Existe = pass.Sp_Autoriza(Login.IdOper, Login.FIRST_NAME).FirstOrDefault();

     que me indica si el usuario es o no correcto;    y por otro lado :

     var ListaMaquina1 = Maquina1.SP_Sel_Maquinas().ToList();

     que me carga un listado de elementos en un combo.

     pero ambos contenidos vienen de otra base de datos,  y como indique, logre agregar la otra base de datos con sus tablas correspondiente y  los sp me reconocen lo devuelto (los campos), pero en el controller de la aplicación los .FirstOrDefault() y el .ToList() me envían error.

    alguna forma de solucionarlo????



    martes, 29 de diciembre de 2020 12:52
  • Insisto en lo que te he dicho: COMPRUEBA EL TIPO.

    Por ejemplo, fíjate en esta línea:

    var Existe = pass.Sp_Autoriza(Login.IdOper, Login.FIRST_NAME).FirstOrDefault();

    Estás llamando a FirstOrDefault sobre el resultado de llamar a sp_Autoriza. Haz click encima de Sp_Autoriza y pulsa la F12 para que te lleve a la definición. Comprueba cuál es el tipo de retorno de este método. Casi seguro que te encontrarás con que NO es un IEnumerable, por lo que el FirstOrDefault no tiene sentido.

    En otras palabras, casi seguro que ese procedimiento devuelve UN resultado y no una lista de resultados, por lo que no puedes llamar a la instrucción FirstOrDefault para tomar el primer resultado de la lista, ya que no existe una lista. Pero esto solo es una hipótesis a partir de los síntomas que relatas. Para eso tienes las herramientas de desarrollo, que te permiten examinar la definición del método para comprobar cuál es su tipo de retorno.

    martes, 29 de diciembre de 2020 13:12
  • gracias, tienes razón, en que me devuelve UN resultado, lo que me extraña,  es que desde que agregue la otra base de datos, me empezó a dar ese error, cuando solo había un modelo de 1 base de datos, funcionaba a la perfección.

    martes, 29 de diciembre de 2020 14:38
  • Hola,

    Gracias por levantar tu consulta en los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    martes, 29 de diciembre de 2020 15:07
    Moderador
  • Ahora, 

     como me sugieres que pueda solucionar el hecho que teniendo los Sp en una base de datos, me puedan hacer consultas y traer datos desde otra Base de Datos?????

    que es la base del post...


    martes, 29 de diciembre de 2020 15:10
  • Bueno, el procedimiento en sí mismo puede internamente acceder a la otra base de datos usando nombres de tres partes. Por ejemplo, el procedimiento puede hacer algo así como esto:

    Select * from laOtraBase.dbo.laTabla

    Esto es transparente para tu programa cliente. Simplemente llamas al procedimiento, y te olvidas de que internamente está trayendo datos desde la otra base de datos.

    martes, 29 de diciembre de 2020 17:38
  • tu dices una cosa como esta:

    select [DRILLCO].[dbo].[EMPLOYEE].[id] as CODIGO,
             upper([DRILLCO].[dbo].[EMPLOYEE].[last_name])  + ' ' + upper([DRILLCO].[dbo].[EMPLOYEE].[first_name]) as [NOMBRE]

      from   [DRILLCO].[dbo].[employee]

      where  [DRILLCO].[dbo].[employee].[id] = @id
      and    [DRILLCO].[dbo].[employee].[first_name] = @FN
      and    [DRILLCO].[dbo].[employee].[active] = 'Y'

    por que si es así, no funciona, al menos desde el entity framework

    envía este mensaje :

    Schema specified is not valid. Errors:
    The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'Control_Turno'. Previously found CLR type 'Drillco_Cambio_Turnos.Control_Turno', newly found CLR type 'Drillco_Cambio_Turnos.Models.AppWeb.Control_Turno'.
    The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'SP_Sel_Ctrl_Turno_Maq_Result'. Previously found CLR type 'Drillco_Cambio_Turnos.SP_Sel_Ctrl_Turno_Maq_Result', newly found CLR type 'Drillco_Cambio_Turnos.Models.AppWeb.SP_Sel_Ctrl_Turno_Maq_Result'.
    The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'SP_Sel_Maq_Fecha_Ant_Result'. Previously found CLR type 'Drillco_Cambio_Turnos.SP_Sel_Maq_Fecha_Ant_Result', newly found CLR type 'Drillco_Cambio_Turnos.Models.AppWeb.SP_Sel_Maq_Fecha_Ant_Result'.
    The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'SP_Sel_Turno_Result'. Previously found CLR type 'Drillco_Cambio_Turnos.SP_Sel_Turno_Result', newly found CLR type 'Drillco_Cambio_Turnos.Models.AppWeb.SP_Sel_Turno_Result'.
    The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'Turnos'. Previously found CLR type 'Drillco_Cambio_Turnos.Turnos', newly found CLR type 'Drillco_Cambio_Turnos.Models.AppWeb.Turnos'.

    de partida en el ActionResult me reclama por falta de la clase, pues la tabla se encuentra en otra BD y por razones obvias, no hace la referencia


    martes, 29 de diciembre de 2020 18:04
  • Ese error de lo que se está quejando es de que tienes los tipos duplicados. Se te han debido quedar desde antes, cuando estuviste probando lo de poner dos .edmx distintos para las dos bases de datos, y ahora tiene las tablas duplicadas. Haz limpieza y prueba de nuevo, o haz primero la prueba en otro proyecto que esté "limpio", donde añadas únicamente objetos de una sola base de datos.

    Esa única base de datos tiene dos opciones: O bien usas la que tiene las tablas, y creas en ella también el procedimiento almacenado (el cual a su vez puede acceder a tablas de la otra base de datos usando un nombre de tres partes), o ben usas la que tiene el procedimiento almacenado, y entonces te traes a ella las tablas de la otra base de datos por mediación de vistas que usen internamente un nombre de tres partes.

    martes, 29 de diciembre de 2020 21:06
  • Saludos,

       la base de datos AAAWeb, tiene 2 tablas y todos los Sp, por que la otra base, es de solo lectura, no le puedo agregar ni quitar nada.

    te traes a ella las tablas de la otra base de datos por mediación de vistas

    te refieres que haga una vista con las condiciones del sp , el problema que uno de los sp es para verificar un usuario y password.

    de todas maneras voy a seguir tus indicaciones...

    martes, 29 de diciembre de 2020 21:54
  • Saludos,  solucione, la situación,  Elimine los 2 modelos, limpie todas las referencias a el y los modelos anteriores,  después hice una limpieza del sistema a través de la opción limpiar,  re conecte los modelo con Usr y Password y todo funciono perfectamente.

    Gracias, por la paciencia.

    • Marcado como respuesta Rodrigo Menares miércoles, 30 de diciembre de 2020 15:24
    miércoles, 30 de diciembre de 2020 15:24