Копирование из EntityCollection в EntityCollection невозможно? - PullRequest
2 голосов
/ 18 апреля 2010

Как бы вы это сделали (псевдокод): product1.Orders.AddRange (product2.Orders);

Однако функция «AddRange» не существует, так как бы вы скопировали все элементы коллекции EntityCollection «Заказы» из product2 в product1?

Должно быть просто, но это не так ...

Ответы [ 3 ]

3 голосов
/ 19 апреля 2010

Проблема глубже, чем вы думаете.

Ваша попытка foreach не удалась, потому что при вызове product1.Orders.Add сущность удаляется из product2.Orders, что делает существующий перечислитель недействительным, что вызывает исключение, которое вы видите.

Так почему сущность удаляется из produc2? Ну, кажется довольно просто: потому что заказ может принадлежать только одному продукту за раз . Entity Framework заботится о целостности данных, применяя правила, подобные этим.

Если я правильно понимаю, ваша цель здесь состоит в том, чтобы на самом деле скопировать заказы от одного продукта к другому, я прав?

Если это так, то вы должны явно создать копию каждого ордера внутри цикла foreach, а затем добавить эту копию в product1.

По какой-то причине, которая мне не совсем понятна, не существует автоматизированного способа создания копии объекта. Поэтому вам в значительной степени приходится вручную копировать все свойства заказа, одно за другим. Вы можете сделать код более аккуратным, включив эту логику в сам класс Order - создайте метод с именем Clone (), который будет копировать все свойства. Однако убедитесь, что вы не копируете свойство «ссылка на продукт владельца», потому что весь ваш смысл состоит в том, чтобы дать ему другой продукт владельца, не так ли?

В любом случае, не стесняйтесь задавать больше вопросов, если что-то неясно. И удачи.

  • Федор
2 голосов
/ 19 апреля 2010

Основываясь на двух предыдущих ответах, я нашел следующее рабочее решение:

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);
        }
    }
0 голосов
/ 18 апреля 2010

Да, обычные функции, связанные с коллекцией, отсутствуют.

Но,
1. Вы проверяли метод CopyTo ?
2. Считаете ли вы какие-либо проблемы с использованием итератора? Вы знаете, GetEnumerator, просмотреть коллекцию и скопировать сущности?

Вышеуказанные два могут решить ваши проблемы. Но я уверен, что в .NET 3.0+ найдутся компактные решения.

Мои ответы связаны с .NET 2.0

...