不可能从EntityCollection复制到EntityCollection?

时间:2010-04-18 18:35:03

标签: c# entity-framework entity

你会怎么做(伪代码):product1.Orders.AddRange(product2.Orders);

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

应该很简单,但不是......

3 个答案:

答案 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

有关