none
Controlador asp net mvc , error en el find RRS feed

  • Pregunta

  • Buenas , mediante EF y mvc5 he creado este controlador.

    El modelo que tengo es este

    El código generado por el controlador por defecto solo incluye el primer parámetro que es id , yo le he añadido weblogin y tienda

    Y aquí esta el error que no se bien que me dice.

    Gracias

    • Cambiado Joyce_AC miércoles, 10 de mayo de 2017 21:25
    miércoles, 10 de mayo de 2017 11:47

Todas las respuestas

  • Lo único que veo si miro directamente sqlServer que el campo tienda que lo tengo definido como byte en el modelo , en la bd es un tinyint

    Gracias,

    miércoles, 10 de mayo de 2017 11:58
  • hola

    Quien define el Find() del cliente, quien genera ese metodo ?

    porque no usas linq, como ser

    Clientes clientes = db.Clientes.FirstOrDefault(x=> x.id == id && x.weblogin == weblogin && x.tienda == tienda);

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 10 de mayo de 2017 12:29
  • hola

    Quien define el Find() del cliente, quien genera ese metodo ?

    porque no usas linq, como ser

    Clientes clientes = db.Clientes.FirstOrDefault(x=> x.id == id && x.weblogin == weblogin && x.tienda == tienda);

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Ese método lo he creado con la opción de agregar --> controlador -->Controlador de MVC5 que usa vistas de entity framework

    Y originalmente me ha creado esto

            // GET: Clientes/Delete/5
            public ActionResult Delete(string id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                Clientes clientes =   db.Clientes.Find(id);
    
    
                if (clientes == null)
                {
                    return HttpNotFound();
                }
                return View(clientes);
            }

    Yo lo que he hecho es añadirle 2 parametros más (negrita)

            // GET: Clientes/Delete/5
            public ActionResult Delete(string id, string weblogin, Byte tienda)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                Clientes clientes =   db.Clientes.Find(id, weblogin, tienda);
    
    
                if (clientes == null)
                {
                    return HttpNotFound();
                }
                return View(clientes);
            }


    • Editado golfgti6 miércoles, 10 de mayo de 2017 12:37
    miércoles, 10 de mayo de 2017 12:37
  • Como he visto que puedo pasarle distintos parámetros según la ayuda de VS he probado de esta forma porque creo que me puede quedar el código más limpio y intuitivo.

    miércoles, 10 de mayo de 2017 12:45
  • hola

    Pero son key values, tu no tienes multiples keys en esa entidad, no aplica lo que estas queriendo realizar

    el Find() busca por la primary key de la tabla, es un array porque puede que tengas una entidad con claves compuestas

    para lo que quires realizar no aplica ese metodo, debes usar linq

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    miércoles, 10 de mayo de 2017 13:48
  • Ok gracias ,  yo pensaba que al tener la clave principal con estos 3 elementos podría hacerlo

    Lo haré con linq ya que no consigo hacerlo funcionar de la otra manera.

    Gracias

    miércoles, 10 de mayo de 2017 14:22
  • mm entonces tenias una key compuesta, entiendo que entonces deberia funcionar, pero la verdad que al usar un orm no se recomienda este tipo de construcciones, son para problema

    se suele crear una key unica secuencial, y despues si lo necesitas una constraint Unique que agrupe estas 3 columnas para evitar duplicados, pero no serian la key de la tabla

    si recomiendaria apliques linq en la busqueda

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 10 de mayo de 2017 15:20
  • Cambiar la firma de tu metodo Delete a:

    Delete(string id, string weblogin,int tienda)


    Si la respuesta es correcta, marcala como correcta.
    Tambien puedes votar como util si te fue de ayuda
    MCPD Windows Developer 4/MVA GOLD/DCE 5 ESTRELLAS PLATINO
    Pedro Marquez - Venezuela

    miércoles, 10 de mayo de 2017 15:34
  • Cambiar la firma de tu metodo Delete a:

    Delete(string id, string weblogin,int tienda)


    Si la respuesta es correcta, marcala como correcta.
    Tambien puedes votar como util si te fue de ayuda
    MCPD Windows Developer 4/MVA GOLD/DCE 5 ESTRELLAS PLATINO
    Pedro Marquez - Venezuela

    Lo he probado tal como este código

           public ActionResult Delete(string id, string weblogin, int tienda)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                Clientes clientes = db.Clientes.Find(id, weblogin, tienda);
    
    
                if (clientes == null)
                {
                    return HttpNotFound();
                }
                return View(clientes);
            }
    

    Pero el error persiste

    Se produjo una excepción de tipo 'System.ArgumentException' en EntityFramework.dll pero no se controló en el código del usuario
    
    Información adicional: El tipo de uno de los valores de clave principal no coincidía con el tipo definido en la entidad. Vea la excepción interna para obtener detalles.

    Gracias,

    miércoles, 10 de mayo de 2017 15:46
  • Hola golfgti6

    Verificando tu tabla que nos mostrabas arriba, el error se produce porque no le estás pasando el tipo de dato correcto, verifica:

    Delete(int id, string weblogin,int tienda)
    // ya que tu id en tu tabla es int, tu weblogin string y el id de tienda int

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    miércoles, 10 de mayo de 2017 15:59
  • Gracias , lo he probado como dices y el error persiste

    Gracias,

    miércoles, 10 de mayo de 2017 16:17
  • Aconsejaria que no te compliques con el Find() si puede usar linq, obteniendo el mismo resultado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 10 de mayo de 2017 16:23
  • Aconsejaria que no te compliques con el Find() si puede usar linq, obteniendo el mismo resultado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Gracias , lo he puesto con linq tal como me dijiste anteriormente.

    Solo me gustaría ver el problema porque no funciona tal cual , si lo llegamos a resolver jeje , es por aprender.

    Gracias,

    miércoles, 10 de mayo de 2017 16:26
  • golfgti6

    Había leído tu error pero no el hilo y aconsejo lo mismo, es mejor usar linq 

    db.Cliente(x => x.id, x=>x.weblogin...)

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    miércoles, 10 de mayo de 2017 16:27
  • >>Solo me gustaría ver el problema porque no funciona tal cual , si lo llegamos a resolver jeje , es por aprender.

    el tema es que si es por aprender deberias empezar por recordar no hacer uso de claves compuestas cuando uses un orm, es para problemas

    como comente una clave simple y despues una constraint unique sobre estos campos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 10 de mayo de 2017 17:07
  • >>Solo me gustaría ver el problema porque no funciona tal cual , si lo llegamos a resolver jeje , es por aprender.

    el tema es que si es por aprender deberias empezar por recordar no hacer uso de claves compuestas cuando uses un orm, es para problemas

    como comente una clave simple y despues una constraint unique sobre estos campos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    He usado una clave compuesta ya que para el diseño que tengo quiero conseguir esto

    login    tienda    idCliente

    central   1           1

    central   1           2

    Es decir para el login central con tienda 1 tengo el campo idCliente desde el 1 hasta el XXXX

    Pero para el login central con tienda 2 quiero que el idCliente empieze desde el 1 hasta el XXXX

    Y si luego hay otro login que es logintest con tienda 1 quiero que el idCliente empieze desde el 1 hasta el XXXX

    Ya que el login central , tienda 1 , idCliente 1 es distinto (para mi lógica de negocio) de  login central , tienda 2 , idCliente 2

    No se si con el diseño que puse anteriormente esto es asin o ando equivocado.

    Gracias

    jueves, 11 de mayo de 2017 7:31
  • hola

    >>Ya que el login central , tienda 1 , idCliente 1 es distinto (para mi lógica de negocio) de  login central , tienda 2 , idCliente 2

    ok pero el uso de una clave compuesta no es la unica alternativa, podrias definir una key simple y luego un constraint unique entre estos campos

    con esto evitas el problema con el orm

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 11 de mayo de 2017 12:46