2010-02-24 24 views
14

Este error se genera cuando trato de cambiar una clave externa. Sé que este es un error muy común. He encontrado toneladas de información al respecto e intenté implementar las correcciones que encontré, pero sigo teniendo este error al intentar actualizar las claves. Reference ThreadLINQ to SQL ForeignKeyReferenceAlreadyHasValueException error

Originalmente estaba asignando directamente el valor y no tratando de mapear las entidades.

ticket.assigned_to_group = assigned_to 

He cambiado desde entonces para tratar de mapear las entidades que creo que la respuesta es correcta; sin embargo, sigo recibiendo el error.

ticket.assigned_to_group = db.sub_units.Single(f => f.id == assigned_to).id; 

Alguna idea de por qué esto no funcionaría. Además, si tengo una tabla con varias claves foráneas, ¿realmente necesito hacer una nueva consulta para cada clave o hay una forma mejor?

Respuesta

34

Creo que está intentando asignar una identificación cuando necesita asignar la entidad. (No estoy 100% seguro de que esto es lo que está haciendo)

// Don't assign just the id 
Person.ParentId = parentId; 

// Assign the entity 
Person.Parent = db.Parents.Single(x.Id == parentId); 
+0

Ah, usted está en lo cierto. Todavía estaba tratando de asignarle a la ID un nuevo valor en lugar de asignarle la entidad. Esto ahora funciona: t.sub_unit = db.sub_units.Single (f => f.id == assigned_to) – Tim

+0

Esto (en mi caso) es solo un problema cuando el Id no puede contener nulos, actualizando los ID nulos mediante la asignación de solo una nueva identificación funciona bien. ¿Por qué es este el caso? – CRice

+0

No debe asignar ParentId. La única tarea necesaria es la entidad. –

0

a su segunda pregunta, puede cargar todos los sub_units por

var groups = db.sub_units.ToArray() y una vez en la memoria de hacer algo como esto:

foreach(var ticket in tickets) 
{ 
    ticket.assigned_to_group = groups.Single(f => f.id == assigned_to); 
} 
+0

Eso no es todo lo que menciono. La clase de ticket tiene FK en varias otras tablas además de 'sub_units'/assigned_to_group table.key. ticket.priority1 = db.priorities.Single (p => p.id == priority_id); ticket.sub_unit = db.sub_units.Single (f => f.id == assigned_to); O tendré que hacer eso para cada tabla relacionada. – Tim