你会怎么做(伪代码):product1.Orders.AddRange(product2.Orders);
但是,函数"AddRange“并不存在,那么如何将EntityCollection "Orders”中的所有项目从product2复制到product1呢?
应该很简单,但事实并非如此。
发布于 2010-04-19 05:18:00
这个问题比你想象的要深。
您的foreach尝试会失败,因为当您调用product1.Orders.Add时,该实体将从product2.Orders中删除,从而使现有的枚举器无效,从而导致您看到的异常。
那么为什么实体要从produc2中移除呢?嗯,看起来很简单:因为订单一次只能属于一个产品。Entity Framework通过执行这样的规则来保护数据的完整性。
如果我理解正确的话,您的目标是将订单从一个产品复制到另一个产品的,对吗?
如果是这样,那么您必须在foreach循环中显式地创建每个订单的副本,然后将该副本添加到product1。
由于某些对我来说相当模糊的原因,没有自动创建实体副本的方法。因此,你必须一个接一个地手动复制订单的所有属性。通过将此逻辑合并到Order类本身中,您可以使代码看起来更整洁-创建一个名为Clone()的方法,该方法将复制所有属性。但是,请务必不要复制“所有者产品引用”属性,因为您的全部目的是为它提供另一个所有者产品,不是吗?
无论如何,如果有什么不清楚的地方,不要犹豫去问更多的问题。祝你好运。
发布于 2010-04-19 15:42:07
基于前两个答案,我提出了以下可行的解决方案:
public static void AddRange<T>(this EntityCollection<T> destinationEntityCollection,
EntityCollection<T> sourceEntityCollection) where T : class
{
var array = new T[sourceEntityCollection.Count()];
sourceEntityCollection.CopyTo(array,0);
foreach (var entity in array)
{
destinationEntityCollection.Add(entity);
}
}发布于 2010-04-19 03:19:33
是的,通常的集合相关函数不在那里。
但,
,你知道吗,GetEnumerator,浏览集合并复制实体?
以上两种方法可以解决你的问题。但是,我相信在.NET 3.0+中会有紧凑的解决方案。
我的答案与.NET 2.0相关
https://stackoverflow.com/questions/2663414
复制相似问题