克隆Enity框架POCO

本文关键字:POCO 框架 Enity 克隆 | 更新日期: 2023-09-27 18:26:23

我需要将实体框架对象克隆到一个新对象中,以便将其保存到数据库中
有没有什么简单的方法可以做到这一点而不需要反思
如果反思是唯一的方法,那么请也为我发布一些代码。

这里的问题如何克隆POCO实体并添加到上下文正在使用序列化,我认为没有必要这样做,而且答案是不使用DbContext,所以这与我的问题完全无关。

感谢

克隆Enity框架POCO

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

    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.ProxyCreateEnabled=false;

客户副本=ctxClone.Customers.Find(2).copy()

Copy here是您定义的只在下面调用MemberwiseClone的方法。

然后进行

ctx.Customers.Add(副本);ctx。SaveChanges();

这是我找到的处理这个问题的最接近的方法。

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

Fyi如果在其他代码中ProxyCreationEnabled=false,则会丢失更改跟踪和延迟加载,因此要小心。