2012-03-21 6 views
5

J'ai une entité (je suis en utilisant le premier code) qui ressemble à ce que:Entity Framework liste chaînée

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; } 
} 

Il n'y a pas de problème pour enregistrer le nœud suivant par exemple. Cependant, si l'ID de Previous est 1 et que j'essaie de définir le Next Node (qui est celui avec ID = 1) sur 2, cette exception est levée.

L'objet ne peut pas être ajouté au contexte de l'objet. L'objet EntityKey a un ObjectStateEntry qui indique que l'objet est participant déjà à une relation différente.

Je sauve le nœud comme ceci:

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); 

Mise à jour ressemble à ceci:

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(); 
} 

Et GetSingle comme ceci:

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

MISE À JOUR 1

La ligne à l'exception est dans la méthode de mise à jour:

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

Je crois que le problème est dans celui-à-un. EF prend uniquement en charge partagée des associations de clé primaire dans ce cas, ce qui signifie essentiellement que si 'Node.ID =' 1' puis Noeud .Previous.ID' et 'Node.Next.ID' doivent aussi être' 1' Aucune autre valeur n'est possible Vous ne pouvez créer une boucle que depuis un noeud vers lui-même, pour ainsi dire. exception? Et quelles valeurs ont 'node.ID',' previousId' et 'nextId' quand vous obtenez l'exception? – Slauma

+0

En fait, cela ne semble pas être le problème. Le scénario est comme ceci: node.id = 2; node.previous.id = 1. Maintenant je vais à node.id = 1 et essaye de mettre node.next.id = 2 - seulement alors l'exception est levée. – Unknown

+0

Avez-vous un mappage avec l'API Fluent (ou des annotations de données)? Pour moi, le modèle ne peut pas être créé, je suis incapable de déterminer l'exception de fin d'association principale. Quelle version EF utilisez-vous? – Slauma

Répondre

0

Est-ce votre contexte dans un bloc en utilisant et en cours de cession à un moment donné? J'ai eu la même « L'objet ne peut être ajouté au contexte de l'objet. Erreurs ». J'ajouterais de iD Précédent et Suivant votre modèle et les utiliser pour mettre à jour les clés étrangères.

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; } 
} 

Pour mettre à jour l'étranger clés ...

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(); 
}