2012-03-21 20 views
5

collegata ho un'entità (sto usando il codice prima) che assomiglia a quello: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; } 
} 

Non c'è nessun problema di salvare il nodo successivo, per esempio. Tuttavia se l'ID di Previous è 1 e provo ad impostare il Next Node (che è quello con ID = 1) a 2 questa eccezione viene lanciata.

L'oggetto non può essere aggiunto al contesto dell'oggetto. L'oggetto EntityKey ha un oggetto ObjectStateEntry che indica che l'oggetto è già partecipante a una relazione diversa.

Mi risparmio il nodo in questo modo:

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

aggiornamento si presenta così:

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

E GetSingle come questo:

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

UPDATE 1

La linea con l'eccezione è nel metodo di aggiornamento:

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

credo che il problema è nel rapporto. EF one-to-one supporta solo condiviso le associazioni di chiave primaria in questo caso che in pratica significa che se 'Node.ID = 1' poi' nodo .Previous.ID' e 'Node.Next.ID' devono anche essere' 1'. Nessun altro valore è possibile.Può solo creare un loop da un nodo a se stesso, per così dire. eccezione? E quali valori hanno 'node.ID',' previousId' e 'nextId' quando ottieni l'eccezione? – Slauma

+0

In realtà questo non sembra essere il problema. Lo scenario è simile a: node.id = 2; node.previous.id = 1. Ora vado su node.id = 1 e provo a impostare node.next.id = 2 - solo allora viene lanciata l'eccezione. – Unknown

+0

Avete qualche mappatura con Fluent API (o annotazioni di dati)? Per me il modello non può essere creato, ottengo l'eccezione "impossibile determinare l'estremità principale dell'associazione". Quale versione EF stai usando? – Slauma

risposta

0

È il vostro contesto in un blocco Using e in via di dismissione ad un certo punto? Ho avuto simile 'L'oggetto non può essere aggiunto al contesto dell'oggetto." Errori. Vorrei aggiungere ID per precedente e successivo al modello e usare quelli per aggiornare le chiavi esterne.

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

Per aggiornare il estera chiavi ...

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