Usuario
Error al dar de alta un cliente que ya existía

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.
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. -
-
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. -
-
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. -
-
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 -
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.
-
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 -
Hola de nuevo Juan,
Dale un vistazo a este otro hilo a ver si podría ser también tu caso:
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. -
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 MejorasSí, 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); }
-
Hola de nuevo Juan,
Dale un vistazo a este otro hilo a ver si podría ser también tu caso:
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. -
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?