C# 无法从EntityCollection复制到EntityCollection?

C# 无法从EntityCollection复制到EntityCollection?,c#,entity-framework,entity,C#,Entity Framework,Entity,如何执行此操作(伪代码):product1.Orders.AddRange(product2.Orders) 但是,函数“AddRange”不存在,因此如何将EntityCollection“Orders”中的所有项目从product2复制到product1 应该很简单,但不是…是的,通常的集合相关函数不存在 但是, 1.您是否检查了方法? 2.你发现使用迭代器有什么问题吗?你知道,GetEnumerator,检查集合并复制实体 以上两种方法可以解决您的问题。但是,我相信在.NET3.0+中会有

如何执行此操作(伪代码):product1.Orders.AddRange(product2.Orders)

但是,函数“AddRange”不存在,因此如何将EntityCollection“Orders”中的所有项目从product2复制到product1


应该很简单,但不是…

是的,通常的集合相关函数不存在

但是,
1.您是否检查了方法?
2.你发现使用迭代器有什么问题吗?你知道,GetEnumerator,检查集合并复制实体

以上两种方法可以解决您的问题。但是,我相信在.NET3.0+中会有紧凑的解决方案


我的答案与.NET2.0有关。这个问题比你想象的要严重

您的
foreach
尝试失败,因为当您调用
product1.Orders.Add
时,该实体将从
product2.Orders
中删除,从而使现有枚举数无效,从而导致出现异常

那么为什么实体会从produc2中删除呢?看起来很简单:因为订单一次只能属于一种产品。实体框架通过执行这样的规则来保证数据的完整性

如果我理解正确,您的目标是将订单从一种产品复制到另一种产品,对吗

如果是这样,那么您必须在
foreach
循环中显式创建每个订单的副本,然后将该副本添加到
product1

由于某种我不太清楚的原因,没有自动创建实体副本的方法。因此,您几乎必须逐个手动复制订单的所有属性。通过将此逻辑合并到Order类本身,您可以使代码看起来更整洁—创建一个名为Clone()的方法,该方法将复制所有属性。但是,请确保不要复制“owner product reference”属性,因为您的全部目的是给它另一个owner产品,不是吗

无论如何,如果有什么不清楚的地方,请不要犹豫,多问一些问题。祝你好运

  • 费奥多

基于前两个答案,我提出了以下有效解决方案:

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);
        }
    }
public static void AddRange(此EntityCollection destinationEntityCollection,
EntityCollection sourceEntityCollection),其中T:class
{
var array=new T[sourceEntityCollection.Count()];
sourceEntityCollection.CopyTo(数组,0);
foreach(数组中的var实体)
{
destinationEntityCollection.Add(实体);
}
}

您使用的是哪个.NET版本?谢谢您的帮助Nayan。1) product2.Orders.CopyTo(product1.Orders)//不起作用,CopyTo不接受EntityCollection作为参数。2) foreach(product2.Orders中的订单){product1.Orders.Add(Order);//不工作}>>“System.InvalidOperationException:集合已修改;枚举操作可能无法执行。”我看到了您的解决方案,但只希望这样。我并没有说我的回答是准确的,而是暗示了可能的解决办法:)干杯!谢谢,费奥多,我没想到这个。新的实体框架在我看来非常简单,有了这些漂亮的向导……请注意,这个解决方案实际上并没有复制订单,只是移动订单。也就是说,当您调用product1.Orders.AddRange(product2.Orders)时,您的product1以所有订单结束,而product2以无订单结束。这就是你想要达到的目的吗?
这个
在争论中?这是打字错误吗?@Fyodor Soikin:这就是我想要实现的目标。“product2”永远不会存储在数据库中。仅存储“product1”@Nayan:“AddRange”是一种C#“extension”方法。