Я подозреваю, что вам не обязательно нужен глубокий клон - нового объекта, с копируемыми свойствами, как правило, достаточно - таким образом, если свойство будет переназначено, оно не будет связываться с исходным клонированным объектом EntityObject.
Кстати, я не вижу проблем с отложенной загрузкой - это то, что вы хотите.
От: http://www.codeproject.com/Tips/474296/Clone-an-Entity-in-Entity-Framework-4
public static T CopyEntity<T>(MyContext ctx, T entity, bool copyKeys = false) where T : EntityObject
{
T clone = ctx.CreateObject<T>();
PropertyInfo[] pis = entity.GetType().GetProperties();
foreach (PropertyInfo pi in pis)
{
EdmScalarPropertyAttribute[] attrs = (EdmScalarPropertyAttribute[])pi.GetCustomAttributes(typeof(EdmScalarPropertyAttribute), false);
foreach (EdmScalarPropertyAttribute attr in attrs)
{
if (!copyKeys && attr.EntityKeyProperty)
continue;
pi.SetValue(clone, pi.GetValue(entity, null), null);
}
}
return clone;
}
Теперь вы можете копировать связанные объекты в клонированный объект; Допустим, у вас было лицо: Клиент, у которого было свойство навигации: Заказы. Затем вы можете скопировать Клиента и его Заказы, используя вышеуказанный метод:
Customer newCustomer = CopyEntity(myObjectContext, myCustomer, false);
foreach(Order order in myCustomer.Orders)
{
Order newOrder = CopyEntity(myObjectContext, order, true);
newCustomer.Orders.Add(newOrder);
}