none
Problema con Inserción RRS feed

  • Pregunta

  • Buenas, estoy teniendo un problemita en la inserción de Entidades, resulta que tengo una entidad, pero no logro hace que se inserte generando el id de manera automática. 

    Si pongo en la propiedad del campo identidad "StoreGeneratedPatern = Identity" me genera un error ya que me dice que no se puede insertar valores en una tabla donde la propiedad Insert_Identity esta en "off"

    esto me ocurre porque el procedimiento que me genera el EF llamado CreatePlantilla me pide que ingrese un parametro como id...

    Ahora, si le pongo la propiedad "StoreGeneratedPatern = None", me deja insertar, pero no me sirve, porque lo que yo quiero es que el sql genere las claves automaticamete...

    Evidentemente tengo un problemita de configuración o algo que no estoy pudiendo saltear 

    Alguna sugerencia!?

    martes, 21 de agosto de 2012 22:59

Respuestas

Todas las respuestas

  • esto me ocurre porque el procedimiento que me genera el EF llamado CreatePlantilla me pide que ingrese un parametro como id...

    pero como si el id es identity el parametro lo esta solicitando para que sea del tipo output, no ?

    digo deberia generse el id en el procedure y devolverlo para asignar la entidad

    estas usando un edmx para definir la entidad no ?

    Inserting,Updating and Deleting entity using Stored Procedures


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    miércoles, 22 de agosto de 2012 2:03
  • Hola Leandro, no conozco mucho ya que soy bastante novato, he realizado otro proyecto (bastante pequeño, con 4 entidades) donde los campos id tenían la propiedad StoreGeneratedPatern = None, y el EF me generaba los procedimientos "createXXX" CON el parámetro del id, a lo que yo siempre le pasaba el 0, pero en al base de datos,  a la hora de guardar, se generaba el id... bien, ahora no he podido reproducir ese comportamiento, y es que no se donde o que paso estoy saltando.

    Obviamente, estaria bueno que en los casos en los que el id se generara automáticamente, no me pidiera el campo id en las funciones "create", pero eso lo genera EF, y si hay alguna configuración para que no lo pida yo la desconozco. Agradecería si pudieras indicarme.

    Muchas gracias, como siempre.

    PD: lei tu link, yo no utilizo storeProcedures, yo utilizo solo lo que se genera con el EF. Saludos!

    • Editado NioDeTark miércoles, 22 de agosto de 2012 18:58
    miércoles, 22 de agosto de 2012 18:53
  • Muy buenas

    Guacharaca, has probado actualizando el modelo de datos???

    Saludos


    Juan Gómez

    jueves, 23 de agosto de 2012 23:42
  • Hola , gracias por responder... A que te refieres con eso1!??! 
    jueves, 23 de agosto de 2012 23:53
  • Pero si el campo en la bd es identity osea autoincrementable no tienes que enviarle este dato ya que la bd lo genera solo siempre que ingresas un nuevo registro.

    Aquí tienes un ejemplo de como hacer las operaciones select, insert, update y delete usando entity framework talvez te sirva

    Mantenimiento a BD Usando Entity Framework y Linq

    Saludos.

    viernes, 24 de agosto de 2012 17:06
  • Claro, es lo que yo suponia, pero el tema es que si pongo autoincremental, cuando le doy generar IGUAL  me crea procedimientos donde me piden ese parámetro... ¿me explico?, es como que me lo pide, pero a la hora de insertar me lo rechaza.

    Gracias por responder!


    viernes, 24 de agosto de 2012 21:33
  • Claro, es lo que yo suponia, pero el tema es que si pongo autoincremental, cuando le doy generar IGUAL  me crea procedimientos donde me piden ese parámetro... ¿me explico?, es como que me lo pide, pero a la hora de insertar me lo rechaza.

    Gracias por responder!


    Muy buenas

    Guacharaca, tengo una duda a que te refieres con que te crea un procedimiento???, estas seguro que no es un pocedimiento almacenado tuyo???, y de ser asi por que no te fijas en que momento se manda a ejecutar estes procedimiento??? una solucion no seria modificar el procedimiento para que no te pida ese valor, esto porque es curioso que sea al momento de insertar un registro el procedimiento se dispare, revisa primeramente como mandas a insertar los registro, una forma simple seria asi:

    nombre_modelo.nombre_objecto.AddObject(nombre_entidad);

    nombre_modelo.SaveChange();

    Saludos


    Juan Gómez

    viernes, 24 de agosto de 2012 22:36
  • Hola , gracias por responder... A que te refieres con eso1!??! 

    Muy buenas

    Guacharaca, si estas utilizando el Entity Framework, el genera un modelo de datos con extencion .edmx.

    Saludos


    Juan Gómez

    viernes, 24 de agosto de 2012 22:39
  • Hola, a ver, en el modelo de EF, yo diseño la entidad, cuando le doy generar, el EF me crea un sub al que llama "createPlantilla" por ejemplo (si la entidad en cuestion se llama "plantilla") .

    Este sub me pide todos los parametros que yo defini a la hora de modelar, entre ellos el id. 

    Como verás, yo no creo ningun procedimiento, ni en vb ni en el sql. Le dejo todo el trabajo al EF.

    Ahora, en las propiedades del campo id existe una que se llama  "clave de identidad" = true

    y otra qeu se llama "StoreGeneratedPatern", segun tengo entendido, esta puede tomar 3 valores 

    None: no hace nada...

    Identity: deberia generar la bd el id

    Computed: aquellas columnas que no son replicadas en la db, sino que son calculados en base a otros campos o valores

    ahora si vemos del lado del sql

    el campo id deberia tener la propiedad "especificacion de identidad = si"

    Incremento = 1

    El codigo que tengo es el siguiente :

        Shared Function crear(titulo As String, Descripcion As String, p As Plantilla) As NodoPlantilla
            Dim nN As New nroNodo
            nN = nN + 1
            Dim n As NodoPlantilla = NodoPlantilla.CreateNodoPlantilla(0, titulo, Descripcion, nN, p.id_plantilla, 0)
            Return (n)
        End Function

    El código de arriba simplemente es uno que cree para SIMPLIFICAR lo que seria el create, que tiene muchos parametros innecesarios al usuario.

    Luego, a esto lo llamo de la siguiente manera:

                n = NodoPlantilla.crear("DATOS PERSONALES", "", p)
                db.NodoPlantillas.AddObject(n)
                db.SaveChanges()

    y ... por ejemplo, en la prueba reciente me tira la siugente excpecion :

    No se pudo determinar una ordenación válida para operaciones dependientes. Pueden existir dependencias debidas a restricciones de clave externa, requisitos de modelo o valores generados por el almacén.

    viernes, 24 de agosto de 2012 23:05
  • Googleando encontre que puede ser porque en esta tabla, yo tengo una referencia circular, es decir a si misma, .... no entiendo bien lo que me quieren decir, pego el link y si alguien ya sabe del problema me puede ayudar...

    http://stackoverflow.com/questions/4304298/circular-dependency-in-entity-framework

    • Marcado como respuesta NioDeTark miércoles, 19 de septiembre de 2012 20:10
    viernes, 24 de agosto de 2012 23:11
  • Bueno, si bien el problema venia de ese link que pegue mas abajo, simplemente para terminar comento que no fue facil corregir el problema, lo que hice fue mediante el generador de diagramas del SQL cree las relaciones que el modelo exigia,  y luego, desde el EF use la opcion "actualizar el modelo desde la base de datos".

    Saludos a todos y gracias por su tiempo.

    miércoles, 19 de septiembre de 2012 20:16
  • Hola yo tenia ese mismo problema aunque no se si en las mismas circunstancias me estaba dando ese error al momento de insertar pero en mi caso mi campo era autoincrementable en la base de datos entonces el problema era que quien habia hecho el procedimiento habia declarado la llame para que fuera solicitada por el procedimiento por lo cual al momento de insertar me estaba enviando un parametro que no lo manejaba lo que hice fue modificar el procedimiento y actualizarlo en mi modelo y listo sin ningun otra dificultad pude seguir con el proyecto.
    sábado, 22 de junio de 2013 0:29
  • Hola, no me quedo muy en claro lo que pusiste en la parte "...el problema era que quien habia hecho el procedimiento habia declarado la llame para que fuera solicitada por el procedimiento..."

    si interprete correctamente, hiciste lo mismo que hago yo para solucionar, modifico el procedimiento para que no pida el parámetro, ahora, cada vez que genero el edmx, se vuelven a generar todos los procedimientos y me pisan las correcciones.

    Saludos

    lunes, 24 de junio de 2013 20:30