me encontré con un problema que intenta actualizar un campo de clave externa:¿Cómo actualizo una clave foránea de manera eficiente en LINQ to SQL/SQLMetal?
record.ForeignId = newId;
bombardea con "Operación no es válida debido al estado actual del objeto", debido a que el código SQLMetal lanza System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException()
.
que no era la primera en llegar este tema:
LinqToSQL Error : Operation is not valid due to the current state of the object y http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/f9c4a01a-195a-4f2b-a1cb-e2fa06e28b25/ analizar el caso, entre otros.
Su solución es la siguiente:
record.Foreign = Database.Foreigns.Single(c => c.Id == newId);
Eso, por supuesto provoca una búsqueda de base de datos de Asuntos Exteriores sólo para tener una espalda objeto que tiene el Id Ya sé! Entonces, ¿cómo logro esta actualización sin la consulta inútil (o las consultas si tengo muchas de estas FK)?
No sabía de Attach(), pero lo intenté y obtuve un error de clave duplicada: "No se puede agregar una entidad con una clave que ya está en uso". ¿Hizo una consulta al DB para averiguarlo, o fue ese registro tal vez solo colgando en mi contexto de datos ...? –
DataContext realiza un seguimiento de todos los registros que ha cargado (por clave principal). Si ha cargado un Parent con Id = 5, no podrá adjuntar otra instancia de Parent con Id = 5. –
¿Y hay alguna forma de ver si uno está en caché y pescarlo si lo hace? ¿Y de lo contrario desmotar uno nuevo como en tu respuesta? ¿O tal vez le dices que deje caer la que tiene primero? O cualquier cosa para hacer que este esquema funcione? –