克隆实体框架 POCO

Clone Enity framework POCO

我需要将一个 Entity Framework 对象克隆到一个新对象中,以便将其保存到数据库中。
有什么简单的方法可以做到这一点而不用反思吗?
如果反思是唯一的方法,那么也请 post 给我一些代码。

问题在这里 How to Clone POCO entity and add to context 正在使用序列化,我认为没有必要这样做,而且答案也没有使用 DbContext,所以它与我的问题完全无关。

谢谢

这是我编写的用于填充两个对象的公共值的扩展方法的示例。

    public static void PopulateInto(
        this object source,
        object target,
        BindingFlags flags)
    {
        foreach (var pi in source.GetType().GetProperties(flags))
        {
            var tpi = target.GetProperty(pi.Name, flags);

            if (tpi.IsNotNull())
            {
                try
                {
                    object originalValue;
                    object value = originalValue = source.GetValue<object>(pi.Name, new object[0], flags);
                    try
                    {
                        value = Convert.ChangeType(originalValue, tpi.PropertyType);
                    }
                    catch
                    {
                    }
                    tpi.SetValue(target, value, new object[0]);
                }
                catch
                {
                }
            }
        }
    }

我找到了一个不错的转机。

如果您尝试 MemberwiseClone() 获取对象的副本,然后将对象添加到上下文和 SaveChanges() 中,您将收到错误消息,因为 MemberwiseClone() 也会克隆动态代理。

所以我的转身是

为克隆目的创建一个新的上下文。
然后做

ctx.Configuration.ProxyCreationEnabled = 假;

客户文案=ctxClone.Customers.Find(2).Copy()

复制这里是你定义的方法,只是在下面调用MemberwiseClone。

然后

ctx.Customers.Add(复制); ctx.SaveChanges();

这是我找到的解决此问题的最近路线。

如果您更喜欢反射解决方案,那就去做吧。

仅供参考,如果您在其他代码中使用 ProxyCreationEnabled = false,您将失去更改跟踪和延迟加载,因此请小心。