我需要将实体框架对象克隆到新对象中,以便将其保存到数据库中。
有没有简单的方法来做到这一点没有反思?
如果反思是唯一的方法,那么请为我发布一些代码。克隆实体框架POCO
这里 How to Clone POCO entity and add to context 的问题是使用序列化,我不认为有必要做这件事,也回答不使用的DbContext所以它完全无关我的问题。
感谢
我需要将实体框架对象克隆到新对象中,以便将其保存到数据库中。
有没有简单的方法来做到这一点没有反思?
如果反思是唯一的方法,那么请为我发布一些代码。克隆实体框架POCO
这里 How to Clone POCO entity and add to context 的问题是使用序列化,我不认为有必要做这件事,也回答不使用的DbContext所以它完全无关我的问题。
感谢
我发现了一个不错的转身。如果您尝试使用MemberwiseClone()获取对象的副本,然后将该对象添加到上下文和SaveChanges()中,您将收到错误,因为MemberwiseClone()也会克隆动态代理服务器。
所以我的转身是
只为克隆目的创建新的上下文。
然后做
ctx.Configuration.ProxyCreationEnabled = false;
客户副本= ctxClone.Customers.Find(2).Copy()这里
副本是你定义的只是调用MemberwiseClone下面的方法。
然后做
ctx.Customers.Add(copy); ctx.SaveChanges();
这是我发现处理这个问题最近的路线。
如果您更喜欢反射解决方案,那就去做吧。
Fyi如果您在其他代码中ProxyCreationEnabled = false,您将失去更改跟踪和延迟加载,因此请小心。
这是一个扩展方法我写来填充两个对象的公共值的一个例子。
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
{
}
}
}
}
谢谢夏普忍者贡献良多。 – Dotnetsqlcoder
可能重复[如何克隆POCO实体并添加到上下文](http://stackoverflow.com/questions/3934208/how-to-clone-poco-entity-and-add-to-context) – mikus
只是克隆它像任何其他对象,广泛的主题,一堆解决方案,并要求反思的例子...甚至没有试图寻找可用的thousends之一?相当可耻的懒惰我会说 – mikus
,你懒得发布解决方案?或者你不知道? – Dotnetsqlcoder