2016-07-29 21 views
2

Ich muss Entitäten mit dem gleichen Primärschlüssel Wert in einer einzigen Anfrage entfernen und hinzufügen, kann mir jemand die Lösung vorschlagen?Entity Framework: Entfernen und Hinzufügen von Entitäten mit demselben Schlüssel in einer einzigen Anfrage

Unten ist mein Beispielcode, der den Fehler gibt: Verletzung der PRIMARY KEY-Einschränkung 'PK_Table'. Kann doppelten Schlüssel in Objekt "Dbo.Table" nicht einfügen.

context.Set<Entity>().Attach(existingEntityObj); 
Entry(existingEntityObj).State = EntityState.Deleted; 

context.Set<Entity>().Add(newEntityObj); 
context.Entry<Entity>(newEntityObj).State = EntityState.Added; 

context.SaveChanges(); 

sei angenommen, sowohl die Objekte (existingEntityObj und newEntityObj) den gleichen Wert in der primären Schlüsseleigenschaft.

danke im voraus !!

+1

Sie müssten die Primärschlüsseleinschränkung löschen, Ihre Entität entfernen, Ihre Entität hinzufügen und die Primärschlüsseleinschränkung wieder hinzufügen. Sie können jedoch keine Primärschlüsseleinschränkungen löschen, wenn sie von FKs referenziert werden. Was du machst, klingt nach einer schlechten Idee. Können Sie das vorhandene Objekt nicht einfach mit den Daten des neuen Objekts ändern? – Pakman

Antwort

2

Sie müssen zwei Aufrufe von SaveChanges() ausführen, damit dies funktioniert. Das Problem hier ist, dass, während es scheint, Sie zuerst den Datensatz löschen und dann einen neuen hinzufügen, das Framework macht tatsächlich die Einfügung zuerst.

Der Grund ist, weil Entity Framework gibt Ihnen keine granulare Kontrolle darüber, in welche Reihenfolge die Operationen passieren. So ist Ihre beste Wette, um die beiden in separate TransactionScope, die Sie die Kontrolle der einzelnen Transaktionen wird vorkommend.

können Sie mehr hier lesen: https://blogs.msdn.microsoft.com/alexj/2009/01/11/savechangesfalse/

+0

Ähnliche Antwort mit Transaktionsbeispiel https://stackoverflow.com/questions/2600688/clear-an-entitycollection-and-then-add-to-it-within-the-same-transaction-doesnt/2601143#2601143 –

2

Eine einzelne Update-Anweisung für Sie arbeiten kann, so dass die Lösung Update ist die alte Einheit mit den neuen Einheit Werte, wenn Sie den gleichen Primärschlüsselwert halten wollen . Da der Primärschlüssel eine Entität identifiziert, hat das Löschen alter und das Hinzufügen eines neuen Schlüssels denselben Effekt wie das Aktualisieren.

Korrigieren Sie mich, wenn Sie das Gefühl haben, dass ich falsch liege, indem Sie mir ein perfektes Beispiel geben.