2015-12-11 230 views
-5

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

这里 How to Clone POCO entity and add to context 的问题是使用序列化,我不认为有必要做这件事,也回答不使用的DbContext所以它完全无关我的问题。

感谢

+0

可能重复[如何克隆POCO实体并添加到上下文](http://stackoverflow.com/questions/3934208/how-to-clone-poco-entity-and-add-to-context) – mikus

+1

只是克隆它像任何其他对象,广泛的主题,一堆解决方案,并要求反思的例子...甚至没有试图寻找可用的thousends之一?相当可耻的懒惰我会说 – mikus

+0

,你懒得发布解决方案?或者你不知道? – Dotnetsqlcoder

回答

0

我发现了一个不错的转身。如果您尝试使用MemberwiseClone()获取对象的副本,然后将该对象添加到上下文和SaveChanges()中,您将收到错误,因为MemberwiseClone()也会克隆动态代理服务器。

所以我的转身是

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

ctx.Configuration.ProxyCreationEnabled = false;

客户副本= ctxClone.Customers.Find(2).Copy()这里

副本是你定义的只是调用MemberwiseClone下面的方法。

然后做

ctx.Customers.Add(copy); ctx.SaveChanges();

这是我发现处理这个问题最近的路线。

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

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

0

这是一个扩展方法我写来填充两个对象的公共值的一个例子。

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 
       { 
       } 
      } 
     } 
    } 
+0

谢谢夏普忍者贡献良多。 – Dotnetsqlcoder