2012-04-05 7 views
19

Ich versuche, eine Entität mit einer FK-Beziehung in EntityFramework 4.3 Code zuerst zu aktualisieren. Ich versuche, durch den Aufruf an das damit verbundene entites anbringt: bereits im Object existiert Ein Objekt mit dem gleichen Schlüssel: Entry (Artikel) .State = EntityState.UnchangedEntityFramework Code zuerst - Überprüfen, ob Entität angefügt ist

Ich erhalte die folgende Ausnahme. Der ObjectStateManager kann mehrere Objekte mit demselben Schlüssel nicht verfolgen.

Ich aktualisiere diese Elemente nicht und habe keine ID-Eigenschaft für sie auf meiner Haupteinheit. Ist es möglich zu wissen, welche Entitäten angehängt sind oder nicht?

Vielen Dank im Voraus, Radu

+0

Sie können ObjectContext.ObjectStateManager.GetObjectStateEntries() -Methode (http://msdn.microsoft.com/en-us/library/bb738497.aspx) verwenden, um alle Einheiten zu erhalten, die durch den Kontext verfolgt werden. Beachten Sie, dass dies möglich ist, wenn sich Entitäten in der Datenbank befinden, die nicht von ObjectContext verfolgt werden. Sie müssen einen Status angeben, damit der ObjectStateManager wissen kann, welche Entitäten Sie benötigen (dieser Enumer hat das Attribut Flags, so dass Sie verschiedene Werte mit | kombinieren können). – Pawel

Antwort

42

Sie finden die Antwort here.

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

Platzieren Sie diesen Code in Ihren Kontext, oder Sie können ihn in eine Erweiterung wie folgt umwandeln.

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

Danke. Das half mir auch. Eine weitere Notiz mit der Funktion oben. Sie müssen wo T: Klasse setzen, sonst wird der Compiler beschweren. – Sylpheed

+0

@Sylpheed Danke, ich habe die Antwort aktualisiert –

+0

TContext scheint nicht notwendig, der erste Parameter wäre stattdessen vom Typ DbContext - public static bool Existiert (dieser DbContext-Kontext, TEntity entity) ... –

5

Sie diese Methode verwenden können:

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

Zum Beispiel:

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

Ich habe einige Leistungstests durchgeführt und (überraschend) festgestellt, dass ObjectStateManager.TryGetObjectStateEntry über 70 Mal langsamer war Set () .Local.Any ( – Brent

Verwandte Themen