Kann man überprüfen, ob ein Objekt bereits an einen Datenkontext in Entity Framework angehängt ist?

.net entity-framework

Frage

Beim Versuch, ein Objekt anzuhängen, das bereits über context.AttachTo(...) an einen bestimmten Kontext angehängt ist, wird folgende Fehlermeldung context.AttachTo(...) :

Ein Objekt mit demselben Schlüssel ist bereits im ObjectStateManager vorhanden. Der ObjectStateManager kann nicht mehrere Objekte mit demselben Schlüssel verfolgen.

Gibt es eine Möglichkeit, etwas zu erreichen, etwa:

context.IsAttachedTo(...)

Prost!

Bearbeiten:

Die Erweiterungsmethode, die Jason umrissen hat, ist nahe, funktioniert aber für meine Situation nicht.

Ich versuche, einige Arbeiten mit der in der Antwort auf eine andere Frage beschriebenen Methode auszuführen:

Wie lösche ich eine oder mehrere Zeilen aus meiner Tabelle mit Linq to Entities *, ohne * die Zeilen zuerst abzurufen?

Mein Code sieht ein bisschen so aus:

var user = new User() { Id = 1 };
context.AttachTo("Users", user);
comment.User = user;
context.SaveChanges();

Dies funktioniert gut, außer wenn ich etwas anderes für diesen Benutzer mache, wo ich dieselbe Methode verwende und versuche, ein Dummy- User anzuhängen. Dies schlägt fehl, weil ich dieses Dummy-Benutzerobjekt zuvor angehängt habe. Wie kann ich das überprüfen?

Akzeptierte Antwort

Hier ist was ich endete, was sehr gut funktioniert:

public static void AttachToOrGet<T>(this ObjectContext context, string entitySetName, ref T entity)
    where T : IEntityWithKey
{
    ObjectStateEntry entry;
    // Track whether we need to perform an attach
    bool attach = false;
    if (
        context.ObjectStateManager.TryGetObjectStateEntry
            (
                context.CreateEntityKey(entitySetName, entity),
                out entry
            )
        )
    {
        // Re-attach if necessary
        attach = entry.State == EntityState.Detached;
        // Get the discovered entity to the ref
        entity = (T)entry.Entity;
    }
    else
    {
        // Attach for the first time
        attach = true;
    }
    if (attach)
        context.AttachTo(entitySetName, entity);
}

Sie können es wie folgt aufrufen:

User user = new User() { Id = 1 };
II.AttachToOrGet<Users>("Users", ref user);

Das funktioniert sehr gut, weil es wie context.AttachTo(...) außer Sie können den ID-Trick, den ich oben zitiert habe, jedes Mal verwenden. Sie erhalten entweder das zuvor zugeordnete Objekt oder Ihr eigenes Objekt, das angehängt wird. CreateEntityKey Sie CreateEntityKey im Kontext CreateEntityKey wird sichergestellt, dass es nett und generisch ist und auch mit zusammengesetzten Schlüsseln ohne weitere Codierung funktioniert (da EF dies für uns bereits tun kann!).


Beliebte Antwort

Ein einfacherer Ansatz ist:

 bool isDetached = context.Entry(user).State == EntityState.Detached;
 if (isDetached)
     context.Users.Attach(user);


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum