如何在实体框架 4 中进行深度复制(克隆)?我需要获取 EntityObject 的副本以及所有相关对象的副本。
问问题
3854 次
3 回答
1
这就是我进行通用深拷贝的方式:
public static T DeepClone<T>(this T obj)
{
using (var ms = new MemoryStream()) {
var bf = new BinaryFormatter();
bf.Serialize(ms, obj);
ms.Position = 0;
return (T)bf.Deserialize(ms);
}
}
于 2010-11-15T08:02:40.673 回答
0
我怀疑您不一定需要深度克隆-复制属性的新对象通常就足够了-这样,如果重新分配属性,它就不会与您克隆的原始 EntityObject 混淆。
顺便说一句,我认为延迟加载没有问题——这就是你想要的。
来自: http: //www.codeproject.com/Tips/474296/Clone-an-Entity-in-Entity-Framework-4
public static T CopyEntity<T>(MyContext ctx, T entity, bool copyKeys = false) where T : EntityObject
{
T clone = ctx.CreateObject<T>();
PropertyInfo[] pis = entity.GetType().GetProperties();
foreach (PropertyInfo pi in pis)
{
EdmScalarPropertyAttribute[] attrs = (EdmScalarPropertyAttribute[])pi.GetCustomAttributes(typeof(EdmScalarPropertyAttribute), false);
foreach (EdmScalarPropertyAttribute attr in attrs)
{
if (!copyKeys && attr.EntityKeyProperty)
continue;
pi.SetValue(clone, pi.GetValue(entity, null), null);
}
}
return clone;
}
您现在也可以将相关实体复制到您的克隆对象;假设您有一个实体:客户,它具有导航属性:订单。然后,您可以使用上述方法通过以下方式复制客户及其订单:
Customer newCustomer = CopyEntity(myObjectContext, myCustomer, false);
foreach(Order order in myCustomer.Orders)
{
Order newOrder = CopyEntity(myObjectContext, order, true);
newCustomer.Orders.Add(newOrder);
}
于 2012-10-12T00:47:19.387 回答
0
我相信这已经被问过了。无论哪种方式,您都需要小心这一点。您的克隆过程存在使用反射的危险,因此在查询属性以进行反射时会调用 EF 支持的延迟数据加载。
如果您这样做,请确保您使用的任何内容将实例克隆为实际的 POCO 类(我假设您使用的是 POCOS),这应该可以解决延迟加载问题。只是一个想法。
于 2010-11-15T08:03:16.243 回答