克隆Enity框架POCO
本文关键字:POCO 框架 Enity 克隆 | 更新日期: 2023-09-27 18:26:23
我需要将实体框架对象克隆到一个新对象中,以便将其保存到数据库中
有没有什么简单的方法可以做到这一点而不需要反思
如果反思是唯一的方法,那么请也为我发布一些代码。
这里的问题如何克隆POCO实体并添加到上下文正在使用序列化,我认为没有必要这样做,而且答案是不使用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.ProxyCreateEnabled=false;
客户副本=ctxClone.Customers.Find(2).copy()
Copy here是您定义的只在下面调用MemberwiseClone的方法。
然后进行
ctx.Customers.Add(副本);ctx。SaveChanges();
这是我找到的处理这个问题的最接近的方法。
如果你更喜欢反射解决方案,那就去做吧。
Fyi如果在其他代码中ProxyCreationEnabled=false,则会丢失更改跟踪和延迟加载,因此要小心。