2012-04-05 7 views
19

Sto tentando di aggiornare un'entità con una relazione FK in EntityFramework 4.3 Code First. cerco di collegare alle entités correlati chiamando: Entry (voce) .state = EntityState.UnchangedCodice EntityFramework Primo: verificare se Entità è allegata

ottengo la seguente eccezione: Un oggetto con la stessa chiave è già presente nella ObjectStateManager. ObjectStateManager non può tracciare più oggetti con la stessa chiave.

Non aggiorno questi elementi né ho una proprietà id per loro sulla mia entità principale. È possibile sapere quali entità sono allegate o no?

Grazie in anticipo, Radu

+0

È possibile utilizzare il metodo ObjectContext.ObjectStateManager.GetObjectStateEntries() (http://msdn.microsoft.com/en-us/library/bb738497.aspx) per ottenere tutte le entità che sono monitorati dal contesto. Nota che è possibile che ci siano entità nel database che non sono tracciate da ObjectContext. Devi fornire uno stato per consentire all'oggetto ObjectStateManager di sapere quali entità hai bisogno (questa enumerazione ha attributo Flags in modo da poter combinare valori diversi usando |) – Pawel

risposta

42

È possibile trovare la risposta here.

public bool Exists<T>(T entity) where T : class 
{ 
    return this.Set<T>().Local.Any(e => e == entity); 
} 

Inserisci quel codice nel tuo contesto o puoi trasformarlo in un'estensione come questa.

public static bool Exists<TContext, TEntity>(this TContext context, TEntity entity) 
    where TContext : DbContext 
    where TEntity : class 
{ 
    return context.Set<TEntity>().Local.Any(e => e == entity); 
} 
+2

Grazie, anche questo mi ha aiutato.Un'altra nota con la funzione sopra.Potete mettere dove T: class, altrimenti il ​​compilatore si lamenterà – Sylpheed

+0

@Sylpheed Grazie, ho aggiornato la risposta –

+0

TContext non sembra necessario.Ma il primo parametro è di tipo DbContext invece - public static bool Exists (questo contesto DbContext, entità TEntity) ... –

5

È possibile utilizzare questo metodo:

/// <summary> 
    /// Determines whether the specified entity key is attached is attached. 
    /// </summary> 
    /// <param name="context">The context.</param> 
    /// <param name="key">The key.</param> 
    /// <returns> 
    /// <c>true</c> if the specified context is attached; otherwise, <c>false</c>. 
    /// </returns> 
    internal static bool IsAttached(this ObjectContext context, EntityKey key) 
    { 
     if (key == null) 
     { 
      throw new ArgumentNullException("key"); 
     } 

     ObjectStateEntry entry; 
     if (context.ObjectStateManager.TryGetObjectStateEntry(key, out entry)) 
     { 
      return (entry.State != EntityState.Detached); 
     } 
     return false; 
    } 

Ad esempio:

 if (!_objectContext.IsAttached(entity.EntityKey)) 
     { 
      _objectContext.Attach(entity); 
     } 
+3

Ho fatto alcuni test delle prestazioni e (sorprendentemente) ho trovato ObjectStateManager.TryGetObjectStateEntry era oltre 70 volte più lento di Set () .Local.Any ( – Brent

Problemi correlati