none
Error al dar de alta un cliente que ya existía RRS feed

  • Pregunta

  • Hola, estoy utilizando entity framework 4, sql server 2008 express y objetos POCO para las clases.

    Resulta que tengo la clase cliente, la cual puedo dar de baja sin ningún problema, cambiando un campo lógico, pero al intentar darlo de alta de nuevo, me salta una excepción que me indica que estoy intentando insertar un null en el campo NumeroCliente. Bien, el caso es que este campo no es null, ya que previamente obtengo el cliente para volver a activarlo con el campo lógico que tengo para ello, y viene con el dato correcto que se almacenó en su momento, ya que es un dato que se genera automáticamente y no puede estar vacío.

    ¿Por qué me está intentando insertar un null si lo ha leído correctamente de la BB.DD.?

    Muchas gracias.


    martes, 21 de junio de 2011 13:06

Todas las respuestas

  • Hola,

    Bueno, suena un poco raro pero probaste a incluir la propiedad StoreGeneratedPattern="Identity":

    http://leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework-4/

    Saludos,

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    miércoles, 22 de junio de 2011 10:46
  • Hola, te refieres a incluirla en la columna de la primary key de la clase, ¿verdad? Es que Cliente tiene un Id que está como Identity, pero Numero, que es otro campo, no es primary key sino unique key, y tiene esa propiedad a None.

    Un saludo.

    miércoles, 22 de junio de 2011 11:09
  • Hola de nuevo,

    Me refiero a NumeroCliente, que en teoría es la que entendí que tienes con clave autogenerada...


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    miércoles, 22 de junio de 2011 11:12
  • No, no, NumeroCliente no es la clave de la entidad, es un campo más que tiene una restricción Unique Key.
    miércoles, 22 de junio de 2011 11:15
  • Pues en tal caso no termino de ver muy claro como te pone a null el valor de NumeroCliente...
    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    miércoles, 22 de junio de 2011 11:39
  • Pues así estoy yo, que tampoco sé muy bien por qué en la consulta que me genera para volver a guardar la entidad en la base de datos, en el campo del número, me intenta insertar un null, si lo acabo de leer y viene con él.
    miércoles, 22 de junio de 2011 18:17
  • Hola Juan, podrías mostrar algo de código para ver si hay algo que pudiera estar provocando dicho comportamiento.
    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    TabControl con Mejoras
    lunes, 27 de junio de 2011 6:27
  • Hola, pues esta es mi clase cliente:

     public partial class Cliente {
    
     public virtual int Id { get; set; }
    
     public virtual string Nombre { get; set; }
    
     public virtual string Apellidos { get; set; }
    
     public virtual string CIF { get; set; }
    
     public virtual string NombreComercial { get; set; }
    
     public virtual string Direccion { get; set; }
    
     public virtual string Email { get; set; }
    
     public virtual bool Activo { get; set; }
    
     public virtual string Numero { get; set; } // Este es el campo problemático
    ...
    }
    

    Y estoy utilizando los patrones repositorio y unidad de trabajo. En concreto la función que me falla es esta:

    public void Activar(string cif) {
     var cliente = ObtenerPorCif(cif);
     if (cliente != null) {
      cliente.Activo = true;
     }
     Modificar(cliente);
    }
    

    ya que al hacer el savechanges me salta la excepción de que estoy intentando meter un null en el campo Numero que es obligatorio y debe ser único. Esta es la excepción que me aparece:

    Thrown: "Cannot insert the value NULL into column 'Numero', table 'VS.dbo.Clientes'; column does not allow nulls. INSERT fails.
    The statement has been terminated." 
    

    La función Modificar sólo hace un objectContext.ApplyCurrentValues(EntitySetName, entidad).

    Un saludo.

    lunes, 27 de junio de 2011 7:01
  • Puedes verificar antes de llamar a la función modificar si el cliente, tiene relleno el campo Numero?

    De todas formas, es algo curioso lo que te está pasando, porque por lo que planteas esto no deberia ser un alta sino una modificación así que está tratandote el cliente como si fuera nuevo. Puedes mostrar el código de la función ObtenerPorCif?


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    TabControl con Mejoras
    lunes, 27 de junio de 2011 7:35
  • Hola de nuevo Juan,

    Dale un vistazo a este otro hilo a ver si podría ser también tu caso:

    http://stackoverflow.com/questions/4038713/ef4-context-applycurrentvalues-does-not-update-current-values

    Saludos,

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solución de esta pregunta te ha sido útil.
    lunes, 27 de junio de 2011 7:54
  • Puedes verificar antes de llamar a la función modificar si el cliente, tiene relleno el campo Numero?

    De todas formas, es algo curioso lo que te está pasando, porque por lo que planteas esto no deberia ser un alta sino una modificación así que está tratandote el cliente como si fuera nuevo. Puedes mostrar el código de la función ObtenerPorCif?


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    TabControl con Mejoras

     

    Sí, está comprobado que después de la llamada a ObtenerPorCif, el cliente que se trae de BB.DD. viene con todos los campos correctos, incluido el número.

    Este es el código de ObtenerPorCif:

     

    public Cliente ObtenerPorCif(string cif) {
     return ObjectSet.SingleOrDefault(cliente => string.Compare(cliente.CIF, cif) == 0);
    }
    

     


    lunes, 27 de junio de 2011 8:36
  • Hola de nuevo Juan,

    Dale un vistazo a este otro hilo a ver si podría ser también tu caso:

    http://stackoverflow.com/questions/4038713/ef4-context-applycurrentvalues-does-not-update-current-values

    Saludos,

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solución de esta pregunta te ha sido útil.

    Voy a echarle un vistazo.

    Muchas gracias a ambos.


    PD: Acabo de probar lo que pone en ese hilo cambiado el applycurrentvalues por Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified), pero me sigue tirando el mismo error de que está tratando de insertar un null en el campo Numero.
    lunes, 27 de junio de 2011 8:37
  • Buenasss, he rehecho la parte de acceso a datos sustituyendo entity framework por nhibernate, y haciendo exactamente lo mismo, bueno, algo equivalente, funciona sin problemas. ¿Por qué puede ser que en EF me aparezca este error? ¿Alguna idea? ¿Será que no se lleva bien con los unique key?
    jueves, 30 de junio de 2011 18:31