Beim Versuch, ein Objekt anzuhängen, das bereits an einen bestimmten Kontext angehängt ist, wird folgende Fehlermeldung angezeigt context.AttachTo(...)
:
Im ObjectStateManager ist bereits ein Objekt mit demselben Schlüssel vorhanden. Der ObjectStateManager kann nicht mehrere Objekte mit demselben Schlüssel verfolgen.
Gibt es eine Möglichkeit, etwas in der Art zu erreichen:
context.IsAttachedTo(...)
Prost!
Bearbeiten:
Die von Jason beschriebene Erweiterungsmethode ist nah, funktioniert aber in meiner Situation nicht.
Ich versuche, mit der in der Antwort auf eine andere Frage beschriebenen Methode zu arbeiten:
Mein Code sieht ein bisschen so aus:
var user = new User() { Id = 1 };
context.AttachTo("Users", user);
comment.User = user;
context.SaveChanges();
Dies funktioniert einwandfrei, außer wenn ich etwas anderes für diesen Benutzer mache, bei dem ich dieselbe Methode verwende und versuche, ein Dummy- User
Objekt anzuhängen . Dies schlägt fehl, weil ich dieses Dummy-Benutzerobjekt zuvor angehängt habe. Wie kann ich das überprüfen?
quelle
(T)entry.Entity
manchmal null zurückgegeben wird?T
bereits der Fall istIEntityWithKey
, können Sie dieentity.EntityKey
Eigenschaft nicht einfach verwenden, anstatt sie zu rekonstruieren, oder müssen Sie die erraten / bereitstellenEntitySetName
?Ein einfacherer Ansatz ist:
quelle
.Include()
auch versucht, angehängte Navigationseigenschaften anzuhängen, wenn Sie sie aufrufen.Attach
oderEntityState
auf setzenEntityState.Unchanged
- und sie treten in Konflikt, wenn sich eine der Entitäten auf die bezieht gleiche Entität. Ich habe nicht herausgefunden, wie man nur die Basisentität anfügt, daher musste ich das Projekt ein wenig neu gestalten, um separate Kontexte für jede "Geschäftstransaktion" zu verwenden, für die sie entworfen wurde. Ich werde dies für zukünftige Projekte zur Kenntnis nehmen.Probieren Sie diese Erweiterungsmethode aus (dies ist ungetestet und ohne Manschette):
In Anbetracht der Situation, die Sie in Ihrer Bearbeitung beschreiben, müssen Sie möglicherweise die folgende Überladung verwenden, die
EntityKey
ein Objekt anstelle eines Objekts akzeptiert :EntityKey
Verwenden Sie Folgendes als Richtlinie, um eine in Ihrer Situation zu erstellen :Sie können das
EntityKey
von einer vorhandenen Instanz vonUser
abrufen, indem Sie die EigenschaftUser.EntityKey
(von der SchnittstelleIEntityWithKey
) verwenden.quelle
TryGetObjectStateEntry
, die eineEntityKey
anstelle einer akzeptiertobject
. Ich habe entsprechend bearbeitet. Lassen Sie mich wissen, wenn dies nicht hilft, und wir kehren zum Zeichenbrett zurück.Verwenden Sie den Entitätsschlüssel des Objekts, das Sie überprüfen möchten:
Freundlichkeit,
Dan
quelle
Dies beantwortet die Frage des OP nicht direkt, aber so habe ich meine gelöst.
Dies ist für diejenigen, die
DbContext
anstelle von verwendenObjectContext
.DbSet.Find-Methode :
Grundsätzlich wird das angehängte Objekt des angegebenen Objekts zurückgegeben,
primaryKey
sodass Sie nur die Änderungen auf das zurückgegebene Objekt anwenden müssen, um die richtige Instanz beizubehalten.quelle