lunes, 8 de febrero de 2010

Fallo del Update con Linq to Entities

Hoy cogería al arquitecto responsable de los mensajes de error de Linq to Entities por el cuello y lo ahogaría – pero sin matarlo – por la tarde perdida siguiendo un mensaje de error que desorientaba y que me hizo recorrer los profundos vericuetos de San Google para, al final, hallar la solución en mis narices.

Compañeros: Cuando tienes una bonita entidad y le creas un método de actualización como:
public bool ModificarAsignacion(string codDeposito, int idTurno)
{
Madrid_MovilidadEntities dbv = new Madrid_MovilidadEntities();
var asig = (from asignacion in dbv.Conductores_Gruas
where asignacion.codigo_deposito == codDeposito
&& asignacion.id_turno == idTurno
&& asignacion.asignado == true
select asignacion);

if (asig.LongCount() > 0)
{
foreach (Conductores_Gruas asignados in asig)
{
asignados.asignado = false;
}
dbv.SaveChanges();
           }
Y cuando, lo lanzas se te queda tostado el servidor - si le tienes un Try Catch puesto – o te sale un mensaje espantoso que dice algo así:

“La búsqueda de no se pudo actualizar entityset 'conductores_gruas' porque tiene <definingquery> y no existe ningún elemento <updatefunction> en el elemento <modificationfunctionmapping> que admita la operación actual. no obtuvo ningún resultado.”

No te agobies buscando y buscando. Es más no te compliques la vida cambiando de tecnología e intentándolo con Linq to SQL (tampoco te va a funcionar y tampoco te va a decir porqué). La solución es mucho más sencilla.<

En tu modelo de datos hay una tabla sin clave o claves primarias
 
Lo cual lleva al ORM a avisarte (si es cierto que avisa, pero no le hice ni caso) y te crea una vista o entidad de esta tabla SOLO PARA LECTURA.

Por lo cual la solución es modificar el modelo de datos para que esa tabla tenga al menos una clave primaria. Y actualizar (yo lo borré y lo hice de nuevo) el modelo de entidades… y voala!!

41 comentarios:

Toto dijo...

Groso :D

Anónimo dijo...

Gracias tío!!! Después de perlearme un poquito, tiré de Google y ¡voilà! encontré el fallo. Menos mal que si no sabe Dios el tiempo que perdería.... ¡Mil gracias!!

Diego dijo...

Bruuuto!
La verdad es que mi tabla sí que tenía clave primaria, pero fue comprobarlo, actualizar las tablas por si había algún problema y... por lo visto lo había. Estupendo!
GRacias

Anónimo dijo...

Maestro de maestros!!!

Se agradece amigazo.

Anónimo dijo...

gracias me haz salvado de horas de investigacion.

Saludos.

mikau dijo...

Eres el fucking MASTER!!

Anónimo dijo...

mil gracias, por gente como tu aún segimos en ASP.NET que si no,... de mi parte lo hubiera aventado a la basura !!!! ja ja ja muy buena tu aportacion.

David dijo...

Grandeeeeeeeeeeee Gracias Totales

Anónimo dijo...

Se te agradece mucho el aporte, me has evitado una perdida de tiempo buscando una solucion, gracias y sigue adelante

Anónimo dijo...

Gracias hermano!!!
un abrazo

Anónimo dijo...

eso esta bien porque lo que dise el mensage la lanza no es ni parecido a el fallo(gracias...)

Adolfo dijo...

Muchas gracias! Aportaciones como estas de verdad se agradecen! :D

Anónimo dijo...

Grande Viejo... gracias.

Paranormal Hunter dijo...

Gracias Doctor, me sacaste de un gran apuro.

steven_munoz dijo...

Que buen aporte hermano, ese error seguro me llevaría horas encontrarlo, muchas gracias !!!!

Unknown dijo...

Genial me salvo la vida el dia de hoy gracias

Elio Batista dijo...

Gracias me salvaste un dia de trabajo

Jesús Moreno dijo...

Efectivamente, muchas gracias. La verdad es que tienes toda la razón. Se han lucido con el mensajito. definí las claves primaria de las tablas y me fue bien.

Anónimo dijo...

Wow, en verdad debería estar mejor documentado el error. mil gracias.

Eric! dijo...

Despues de hacer caso a tu consejo ya que mi tabla le faltaba definir una clave me arrojo lo siguinete
...Error al recuperar valores desde ObjectStateEntry...
Pero logre arreglarlo tudb.edmx la clave de la tabla estaban mal y no eran iguales a la DB en SQL, a pesar que corri el proceso que actualice pero bue no funcionaba. Asi que toque las claves del .edmx y listo!
Gracias por tu ayuda hacia un tiempo que lo lograba resolverlo.

Jesús dijo...

Gracias tío por el aporte... Me salvaste la vida....

Adeptos dijo...

Vaya, si tenías razón, que tontería, pues ya podrían ser más claros con el error, es la única tabla que se me había pasado de crear un INDICE PRIMARIO.

1000 Gracias
Toni

Miguell Luna dijo...

y si mi tabla no necesitara primary key que basicamente es una tabla dependiente o secundaria como resolver esto?

Aleks dijo...

Gracias tronco!!!!!

Aleks

Anónimo dijo...

Me has ahorrado horas de perder el tiempo, thank youuuu

Anónimo dijo...

Gracias, no me lo hubiese imaginado en la vida, me has ahorrado mucho tiempo.

Anónimo dijo...

Bueno me sirvió mucho la publicación, debo agregar que ojo porque tiene que ser primary key, nada de index ni unique key.

agradecido...

Anónimo dijo...

Justo me acaba de pasar esto!!! muchas gracias!!! revisando encontré que había 2 tablas sin PK, ya lo arreglé en SQL, cómo hago para corregirlo en mi Model más fácil??

Unknown dijo...

Gracias

Nestor Riascos dijo...

Muchas gracias hermano, inicialmente todo de funcionaba y de repente dejo de funcionar y efectivamente, no tenia clave primaria...

Álvaro dijo...

Gracias, me has ahorrado comerme la cabeza, había warnings abajo pero a veces pasas de ellos como de comer mierda. XD

Anónimo dijo...

oooooo eres un dios! te amo viejo! jajajajaja eso mismo me acaba de pasar :|, GRACIAS!

Anónimo dijo...

Esto sucede cuando el Entity data model es distinto a la base de datos en cuanto a claves, relaciones, restricciones etc. Saludos.

Anónimo dijo...

Gracias viejito... yo tambien te amo....

Anónimo dijo...

Que Dios te lo pague.

Unknown dijo...

Nunca comentar algo. Gracias!

Anónimo dijo...

Monumental!

Unknown dijo...

GENIO TOTAL!!!

Anónimo dijo...

Excelente solución, eres un experto y me ahorraste medio día de búsqueda

Nemesis dijo...

ERES EL MEJOR!!!!!

Anónimo dijo...

Gracias, verdaderamente util :D