2010-11-15 3 views

ответ

1

Это, как я родовая глубокая копия:

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); 
     } 
    } 
+1

Кажется, что вы можете получить исключение StackOverflowException, если ваши сущности имеют круглую ссылку. –

+0

Работал хорошо для меня. – Joshy

0

Я уверен, что это было предложено ранее. В любом случае вам нужно быть осторожным. Существует опасность того, что ваш процесс клонирования использует отражение, тем самым вызывая отложенную загрузку данных, поддерживаемую EF, когда свойства опрошены для отражения.

Если вы делаете это, убедитесь, что все, что вы используете для клонирования ящиков, как экземпляр класса POCO (я предполагаю, что вы используете POCOS), должно обойти проблему отложенной загрузки. Просто идея.

+0

Является ли отложенная загрузка данных еще проблемой, если вы отключите ленивую загрузку? – RPM1984

+0

Нет. До тех пор, пока вы можете иметь дело с нулями. Все должно быть в порядке. – Slappy

0

Я подозреваю, что вам не обязательно нужен глубокий клон - новый объект с полностью скопированными свойствами - таким образом, если свойство повторно назначено, оно не будет конфликтовать с оригинальным клонированным 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); 
} 
Смежные вопросы