2012-03-21 31 views
5

ligado Tengo una entidad (estoy usando el código primero) que se parece a lo siguiente:Entity Framework lista

public class Node 
{ 
    public int ID { get; set; } 
    public string SomeInfo { get; set; } 

    public virtual Node Previous { get; set; } 
    public virtual Node Next { get; set; } 
} 

No hay ningún problema para guardar el siguiente nodo, por ejemplo. Sin embargo, si el ID de Anterior es 1 e intento establecer el Siguiente nodo (que es el que tiene ID = 1) en 2, se lanza esta excepción.

El objeto no se puede agregar al contexto del objeto. El objeto EntityKey tiene un ObjectStateEntry que indica que el objeto es que ya participa en una relación diferente.

me ahorro el nodo de la siguiente manera:

int nextId; 
int previousId; 
if (int.TryParse(Request["previous"], out previousId)) 
    node.Previous = this.nodeRepository.GetSingle(previousId); 

if (int.TryParse(Request["next"], out nextId)) 
    node.Next = this.nodeRepository.GetSingle(nextId); 

this.nodeRepository.Update(node); 

actualización es el siguiente:

public virtual void Update(T entity) 
{ 
    this.context.Entry(GetSingle(entity.ID)).State = EntityState.Detached; 
    this.context.Entry(entity).State = EntityState.Added; 
    this.context.Entry(entity).State = EntityState.Modified; 

    this.Save(); 
} 

Y GetSingle así:

public virtual T GetSingle(object id) 
{ 
    var query = this.entities.Find(id); 
    return query; 
} 

ACTUALIZA 1

La línea con la excepción está en el método de actualización:

this.context.Entry(entity).State = EntityState.Modified; 
+1

creo que el problema es en la relación. EF uno-a-uno sólo admite compartida asociaciones de clave principal en este caso lo que significa básicamente que si 'Node.ID = 1' entonces' nodo .Previous.ID' y 'Node.Next.ID' también deben ser' 1'. No es posible ningún otro valor. Solo puede crear un bucle desde un nodo a sí mismo, por así decirlo. En qué línea exactamente obtiene el excepción? Y qué valores tienen 'node.ID',' previousId' y 'nextId' cuando obtiene la excepción? – Slauma

+0

En realidad, este no parece ser el problema. El escenario es así: node.id = 2; node.previous.id = 1. Ahora voy a node.id = 1 y trato de establecer node.next.id = 2 - solo entonces se lanza la excepción. – Unknown

+0

¿Tiene algún mapeo con Fluent API (o anotaciones de datos)? Para mí, el modelo no se puede crear, obtengo la excepción "no se puede determinar el extremo principal de la asociación". ¿Qué versión de EF estás usando? – Slauma

Respuesta

0

Está su contexto en un bloque de Uso y de ser eliminados en algún momento? He tenido similares 'El objeto no se puede añadir al contexto objeto." Errores. Yo añadiría Id de de Anterior y Siguiente para su modelo y las usará para actualizar las claves externas.

public class Node 
{ 
    public int ID { get; set; } 
    public string SomeInfo { get; set; } 

    public virtual Node Previous { get; set; } 
    public int PreviousId { get; set; } 
    public virtual Node Next { get; set; } 
    public int NextId { get; set; } 
} 

Para actualizar el extranjero llaves ...

int nodeId; // I'm assuming you know the id of node you want updated. 

int nextId; 
int previousId; 


using (var context = new Context()) 
{  
    // Perform data access using the context 
    var node = context.Nodes.find(nodeId); 
    node.NextId = nextId; 
    node.PreviousId = previousId; 
    context.SaveChanges(); 
}