如何在Entity框架4中进行深层复制(克隆)?

时间:2010-11-15 07:54:49

标签: entity-framework entity-framework-4 deep-copy

如何在Entity框架4中进行深层复制(克隆)? 我需要获取EntityObject的副本以及所有相关对象的副本。

3 个答案:

答案 0 :(得分: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 :(得分:0)

我确信此前已被问过。无论哪种方式,你都需要小心这一点。您的克隆过程存在使用反射的危险,因此在查询属性进行反射时会调用EF支持的延迟数据加载。

如果您这样做,请确保您使用的任何克隆框实例作为实际的POCO类(我假设您正在使用POCOS)这应该解决延迟加载问题。只是一个想法。

答案 2 :(得分: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,它有导航属性:订单。然后,您可以使用上述方法复制客户及其订单:

Customer newCustomer = CopyEntity(myObjectContext, myCustomer, false);

foreach(Order order in myCustomer.Orders)
{
    Order newOrder = CopyEntity(myObjectContext, order, true);
    newCustomer.Orders.Add(newOrder);
}