Очень короткий способ дублирования сущностей с использованием обобщений (VB, извините).
Он копирует значения внешнего ключа (внешние идентификаторы), но не загружает связанные с ними объекты.
<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
Например:
newDad = ctx.DuplicateEntity(oDad)
newDad.RIDGrandpa ' int value copied
newDad.Grandpa ' object for RIDGrandpa above, equals Nothing(null)
newDad.Children ' nothing, empty
Я не знаю точно, как перезагрузить Grandpa
в этом случае.
Это не работает:
ctx.SaveChanges()
ctx.Entry(newDad).Reload()
но на самом деле, нет проблем. Я бы лучше назначил Grandpa
вручную, если мне это нужно.
newDad.Grandpa = oDad.Grandpa
EDIT:
Как MattW предлагает в своем комментарии , отсоединяя и находя новую сущность, вы загружаете ее дочерние элементы (не коллекции).
ctx.Entry(newDad).State = EntityState.Detached
ctx.Find(newDad.RowId) 'you have to know the key name