Hello !
I'm trying to implement a code that create a copy of a entity Framework Object and its related childs that I want to be copied.
This is my code :
Now , I;m using the code as below :Code:Imports System.Data.Objects Imports System.Data.Objects.DataClasses Imports System.Runtime.CompilerServices Public Module Entities <Extension()> Public Function CloneEntity(Of T As Class)(entity As T, context As ObjectContext, Optional include As List(Of IncludeEntity) = Nothing, Optional copyKeys As Boolean = False) As T Return CloneEntityHelper(entity, context, include, copyKeys) End Function Private Function CloneEntityHelper(Of T As Class)(entity As T, context As ObjectContext, Optional include As List(Of IncludeEntity) = Nothing, Optional copyKeys As Boolean = False) As T If include Is Nothing Then include = New List(Of IncludeEntity)() Dim myType = entity.GetType() Dim methodInfo = context.GetType().GetMethod("CreateObject").MakeGenericMethod(myType) Dim result = methodInfo.Invoke(context, Nothing) Dim propertyInfo = entity.GetType().GetProperties() For Each info In propertyInfo Dim attributes = info.GetCustomAttributes(GetType(EdmScalarPropertyAttribute), False).ToList() For Each attr As EdmScalarPropertyAttribute In attributes If (Not copyKeys) AndAlso attr.EntityKeyProperty Continue For End If info.SetValue(result, info.GetValue(entity, Nothing), Nothing) Next If info.PropertyType.Name.Equals("EntityCollection`1", StringComparison.OrdinalIgnoreCase) Then Dim shouldInclude = include.SingleOrDefault(Function(i) i.Name.Equals(info.Name, StringComparison.OrdinalIgnoreCase)) If shouldInclude Is Nothing Then Continue For Dim relatedChildren = info.GetValue(entity, Nothing) Dim propertyType As Type = relatedChildren.GetType().GetGenericArguments().First() Dim genericType As Type = GetType(EntityCollection(Of )) Dim boundType = genericType.MakeGenericType(propertyType) Dim children = Activator.CreateInstance(boundType) For Each child In relatedChildren Dim cloneChild = CloneEntityHelper(child, context, shouldInclude.Children, shouldInclude.CopyKeys) children.Add(cloneChild) Next info.SetValue(result, children, Nothing) End If Next Return result End Function Public Class IncludeEntity Public Property Name As String Public Property Children As New List(Of IncludeEntity) Public Property CopyKeys As Boolean Public Sub New(propertyName As String, ParamArray childNodes() As String) Name = propertyName Children = childNodes.Select(Function(n) new IncludeEntity(n)).ToList() End Sub End Class End Module
The code is executed without errors, but nothing is copied, so newitm is just an object with all the values Nothing.Code:Dim litm, newitm As New MyObject Dim inc = New List(Of IncludeEntity)() inc.Add(New IncludeEntity("Child_list")) litm=context.MyObjects.FirstOrDefault newitm = litm.CloneEntity(CType(context, Entity.Infrastructure.IObjectContextAdapter).ObjectContext,include:=inc)
I have insepected my function CloneEntityHelper , and I found that maybe the problem may be this line :
The attributes always have the Length=0.Code:Dim attributes = info.GetCustomAttributes(GetType(EdmScalarPropertyAttribute), False).ToList()
Maybe is another problem.
Can you detect a problem why this code is not working ?
Thank you !




Reply With Quote
