Как сделать глубокое копирование (клонирование) в Entity Framework 4? - PullRequest
0 голосов
/ 15 ноября 2010

Как сделать глубокое копирование (клонирование) в Entity Framework 4?Мне нужно получить копию EntityObject с копиями всех связанных объектов.

Ответы [ 3 ]

1 голос
/ 15 ноября 2010

Вот как я делаю общую глубокую копию:

    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);
        }
    }
0 голосов
/ 12 октября 2012

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

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

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

...