Hi Pete,

I completely agree, clonin is just a patch, but I placed ToArray
everywhere and the problem persists.

I also wrote a unit test and with not lazy collection everything works fine.

I've the exception when I call Session.Merge, and the StackTrace does
not contain nothing,
also without "Just my code" enabled.

I really cannot understand the problem and how to reproduce it in a unit test.


On Fri, Jul 5, 2013 at 12:03 PM, Pete Appleton
<[email protected]> wrote:
> Cloning is definitely the wrong solution IMO, the underlying issue is exactly 
> what the exception message says.  My original code assumed that 'toRemove' 
> was the collection that was getting modified during iteration, but clearly 
> I'm wrong if it didn't work.  Best suggestion for you is to carefully work 
> through the exception stack trace to find out which collection is the 
> problem; once you've found that, then use the ToList() / ToArray() technique. 
>  NB, you may find it helpful to untick the 'Just my code' option in the VS 
> debugger options.
>
> /Pete
>
> -----Original Message-----
> From: [email protected] on behalf of Matteo Migliore
> Sent: Thu 7/4/2013 4:49 PM
> To: [email protected]
> Subject: Re: [nhusers] Modify the collections of an entity "collection was 
> modified" exception
>
> Chris, Pete
>
> the ToDictionary is not deferred exactly the ToList and ToArray,
> so for me is not needed to do anything more.
>
> Instead the clone of the entity works, but I don't like it, because the 
> collections
> are modified also if not necessary.
>
> Idea? :)
>
> Thanks!
> Matteo
>
> On Thursday, July 4, 2013 5:11:30 PM UTC+2, PeteA wrote:
>
>         Change
>                 var toRemove = firstCollection.Where(item => 
> secondCollection.All(x => x.Key != item.Key));
>         to
>                 var toRemove = firstCollection.Where(item => 
> secondCollection.All(x => x.Key != item.Key)).ToArray();
>
>         As it stands, your code is lazily iterating toRemove; as soon as 
> something's removed from it, you'll get exception you described.  This is not 
> related to NHibernate, it's a standard 'feature' of .NET :).
>
>         /Pete
>
>         -----Original Message-----
>         From: [email protected] <javascript:>  on behalf of Matteo 
> Migliore
>         Sent: Thu 7/4/2013 11:58 AM
>         To: [email protected] <javascript:>
>         Subject: [nhusers] Modify the collections of an entity "collection 
> was modified" exception
>
>         Hi,
>
>         I obtain the error "Collection was modified; enumeration operation 
> may not execute." when I try to save (merge)
>         a loaded entity.
>
>         I use AutoMapper to write the values from the DTO (command) to the 
> loaded entity and this method to synchronize
>         the collection between the entity and the command:
>
>         public static ICollection<TFirst> Synchronize<TFirst, TSecond>(
>                 this ICollection<TFirst> first,
>                 IEnumerable<TSecond> second,
>                 Func<TSecond, TFirst> convert = null,
>                 Func<TFirst, int> firstHash = null,
>                 Func<TSecond, int> secondHash = null)
>         {
>                 if (firstHash == null)
>                 {
>                         firstHash = x => x.GetHashCode();
>                 }
>
>                 if (secondHash == null)
>                 {
>                         secondHash = x => x.GetHashCode();
>                 }
>
>                 if (convert == null)
>                 {
>                         convert = x => Mapper.Map<TFirst>(x);
>                 }
>
>                 var firstCollection = first.ToDictionary(x => firstHash(x), x 
> => x);
>                 var secondCollection = second.ToDictionary(x => 
> secondHash(x), x => x);
>
>                 var toAdd = secondCollection.Where(item => 
> firstCollection.All(x => x.Key != item.Key)).Select(x => convert(x.Value));
>
>                 foreach (var item in toAdd)
>                 {
>                         first.Add(item);
>                 }
>
>                 var toRemove = firstCollection.Where(item => 
> secondCollection.All(x => x.Key != item.Key));
>
>                 foreach (var item in toRemove)
>                 {
>                         first.Remove(item.Value);
>                 }
>
>                 return first;
>         }
>
>         How can I fix the problem?
>
>         Thanks,
>         Matteo
>
>         --
>         You received this message because you are subscribed to the Google 
> Groups "nhusers" group.
>         To unsubscribe from this group and stop receiving emails from it, 
> send an email to [email protected] <javascript:> .
>         To post to this group, send email to [email protected] 
> <javascript:> .
>         Visit this group at http://groups.google.com/group/nhusers 
> <http://groups.google.com/group/nhusers> .
>         For more options, visit https://groups.google.com/groups/opt_out 
> <https://groups.google.com/groups/opt_out> .
>
>
>
>
>
> --
> You received this message because you are subscribed to the Google Groups 
> "nhusers" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/nhusers.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>
>
> --
> You received this message because you are subscribed to a topic in the Google 
> Groups "nhusers" group.
> To unsubscribe from this topic, visit 
> https://groups.google.com/d/topic/nhusers/OLXzSw0sU2s/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to 
> [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/nhusers.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to