Как сделать глубокую копию (клон) в структуре Entity 4? Мне нужна копия EntityObject с копиями всех связанных объектов.Как сделать глубокую копию (клон) в структуре Entity 4?
ответ
Это, как я родовая глубокая копия:
public static T DeepClone<T>(this T obj)
{
using (var ms = new MemoryStream()) {
var bf = new BinaryFormatter();
bf.Serialize(ms, obj);
ms.Position = 0;
return (T)bf.Deserialize(ms);
}
}
Я уверен, что это было предложено ранее. В любом случае вам нужно быть осторожным. Существует опасность того, что ваш процесс клонирования использует отражение, тем самым вызывая отложенную загрузку данных, поддерживаемую EF, когда свойства опрошены для отражения.
Если вы делаете это, убедитесь, что все, что вы используете для клонирования ящиков, как экземпляр класса POCO (я предполагаю, что вы используете POCOS), должно обойти проблему отложенной загрузки. Просто идея.
Я подозреваю, что вам не обязательно нужен глубокий клон - новый объект с полностью скопированными свойствами - таким образом, если свойство повторно назначено, оно не будет конфликтовать с оригинальным клонированным 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;
}
Вы можете скопировать связанные entites к вашему клонированного объекта сейчас тоже; скажем, у вас есть лицо: Клиент, у которого есть свойство навигации: Заказы. Затем вы можете скопировать Клиента и их Заказы, используя вышеуказанный метод:
Customer newCustomer = CopyEntity(myObjectContext, myCustomer, false);
foreach(Order order in myCustomer.Orders)
{
Order newOrder = CopyEntity(myObjectContext, order, true);
newCustomer.Orders.Add(newOrder);
}
- 1. Как сделать глубокую копию BitmapDrawable?
- 2. Как сделать глубокую копию?
- 3. Как сделать глубокую копию массива?
- 4. Как сделать глубокую копию LpVariables
- 5. Как сделать глубокую копию OWLOntology
- 6. сделать глубокую копию в Java
- 7. Как сделать глубокую копию очереди в python
- 8. Как сделать глубокую копию в javascript?
- 9. Как сделать глубокую копию в Objective-C?
- 10. Как сделать глубокую копию InputStream в Java
- 11. Как вручную создать глубокую копию
- 12. Как сделать «глубокую» копию функции-Javascript
- 13. Как сделать глубокую копию всего QDomDocument
- 14. Как сделать глубокую копию объекта на Java?
- 15. Как сделать глубокую копию класса Python?
- 16. Как сделать глубокую копию NSDictionary, простой способ?
- 17. Как сделать глубокую копию шаблона словарь
- 18. Как сделать глубокую копию объектов NHibernate?
- 19. как сделать глубокую копию моего списка
- 20. Как сделать глубокую копию Groovy ConfigObject?
- 21. Как сделать глубокую копию этого конструктора?
- 22. Сделайте глубокую копию словаря
- 23. Создайте глубокую копию в C#
- 24. Как сделать глубокую копию словаря в словаре в C#?
- 25. JQuery продлить глубокую копию
- 26. Создать глубокую копию записи?
- 27. Как сделать глубокую копию динамически созданного элемента в jQuery?
- 28. Как сделать глубокую копию объекта в списке ссылок
- 29. Как сделать глубокую копию элемента в LINQ to XML?
- 30. В Perl, как я могу сделать глубокую копию массива?
Кажется, что вы можете получить исключение StackOverflowException, если ваши сущности имеют круглую ссылку. –
Работал хорошо для меня. – Joshy