Eine wirklich kurze Art der Duplizierung von Entitäten mit Generika (VB, sorry).
Es kopiert Fremdschlüsselwerte (externe IDs), lädt jedoch nicht die zugehörigen Objekte.
<Extension> _
Public Function DuplicateEntity(Of T As {New, Class})(ctx As myContext, ent As T) As T
Dim other As New T 'T is a proxy type, but New T creates a non proxy instance
ctx.Entry(other).State = EntityState.Added 'attaches it to ctx
ctx.Entry(other).CurrentValues.SetValues(ent) 'copies primitive properties
Return other
End Function
Zum Beispiel:
newDad = ctx.DuplicateEntity(oDad)
newDad.RIDGrandpa ' int value copied
newDad.Grandpa ' object for RIDGrandpa above, equals Nothing(null)
newDad.Children ' nothing, empty
ich nicht genau weiß, wie Grandpa
in diesem Fall erneut zu laden.
funktioniert das nicht:
ctx.SaveChanges()
ctx.Entry(newDad).Reload()
aber wirklich, kein Problem. Ich würde lieber Grandpa
von Hand zuweisen, wenn ich es brauche.
newDad.Grandpa = oDad.Grandpa
EDIT: Als MattW proposes in his comment, Abnehmen und die Suche nach der neuen Einheit Sie ihre Kinder bekommen geladen (nicht Sammlungen).
ctx.Entry(newDad).State = EntityState.Detached
ctx.Find(newDad.RowId) 'you have to know the key name
Es scheint, dass es nicht schöner Lösung ist, so werde ich dies als eine Antwort akzeptieren :) – Tx3
@ Tx3 Wenn eine der Antworten später die mehr von der Nettigkeit bieten hinzugefügt Sie suchen, fühlen sich frei, um die akzeptierte Antwort zu aktualisieren. :-) –
Die hier angebotene Lösung (http://stackoverflow.com/a/15322430/159341) fühlt sich an wie eine viel sauberere Lösung. Verwenden von 'AsNoTracking()', um ein losgelöstes Objekt zurückzugeben, das erneut hinzugefügt werden kann, wodurch beim Speichern des Kontexts eine neue Entität erstellt wird. – Tr1stan