你会怎么做(伪代码):product1.Orders.AddRange(product2.Orders);
但是,“AddRange”函数不存在,那么如何将EntityCollection“Orders”中的所有项目从product2复制到product1?
应该很简单,但不是......
答案 0 :(得分:3)
问题比你想象的更深。
您的foreach
尝试失败,因为当您致电product1.Orders.Add
时,该实体将从product2.Orders
中移除,从而导致现有的枚举器无效,从而导致您看到的异常。
那为什么实体会从produc2中删除?好吧,看起来很简单:因为订单一次只能属于一个产品。实体框架通过执行这样的规则来处理数据完整性。
如果我理解正确,那么您的目标是实际 复制 从一个产品到另一个产品的订单,我是否正确?
如果是这样,那么您必须在foreach
循环中明确创建每个订单的副本,然后将该副本添加到product1
。
由于某种原因,我觉得这一点并不明确,因此没有自动创建实体副本的方法。因此,您几乎必须逐个手动复制所有Order的属性。您可以通过将此逻辑合并到Order类本身来使代码看起来更整洁 - 创建一个名为Clone()的方法来复制所有属性。但是,请确保不要复制“所有者产品参考”属性,因为您的重点是给它另一个所有者产品,不是吗?
无论如何,如果不清楚,请不要犹豫,提出更多问题。祝你好运。
答案 1 :(得分:2)
根据前两个答案,我提出了以下工作解决方案:
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);
}
}
答案 2 :(得分:0)
是的,通常的收集相关功能不存在。
但是,
1.您检查了CopyTo方法吗?
2.您是否发现使用迭代器有任何问题?你知道,GetEnumerator,浏览集合并复制实体吗?
以上两个可以解决您的问题。但是,我确信在.NET 3.0+中会有紧凑的解决方案。
我的答案与.NET 2.0
有关