What does AddEntityCriteria look like and how does it use the entryIds?
-----Original Message----- From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Jatin Sent: Monday, November 10, 2008 6:38 PM To: nhusers Subject: [nhusers] System.InvalidOperationException. Collection was modified; enumeration operation may not execute Hi All I get the following exception when using Criteria objects in NHibernate. The error is only coming up in production and not in Dev or UAT. I am stumped as cant replicate the error and need to fix this asap. The error and the code resulting in the error are below. Any help will be greatly appreciated. I am hitting the database multiple times with the same Nhibernate session. Is that the problem. Thanks Jatin. The error : Base exception: System.InvalidOperationException Collection was modified; enumeration operation may not execute. Stack Trace: at System.Collections.Hashtable.HashtableEnumerator.MoveNext() at NHibernate.Impl.Printer.ToString(IEnumerator enumerator) at NHibernate.Impl.SessionImpl.FlushEverything() at NHibernate.Impl.SessionImpl.AutoFlushIfRequired(ISet querySpaces) at NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria, IList results) at NHibernate.Impl.SessionImpl.Find[T](CriteriaImpl criteria) at NHibernate.Impl.CriteriaImpl.List[T]() at GrantEd.UtilityServices.ExtendedAttribute.AttributeInstancePathEvaluator .InternalEvaluate(List`1 entities) in C:\UserData\SEMISPT\Source\Development\UtilityServices \ExtendedAttribute\GrantEd.UtilityServices.ExtendedAttribute\Controller \AttributeInstancePathEvaluator.cs:line 121 The piece of code that results in the error: public IAttributeInstances InternalEvaluate(List<KeyValuePair<string, int?>> entities) { IAttributeInstances attributeInstances = new AttributeInstances(); using (ISession session = NHibernateSessionManager.Instance.GetSession<AttributeInstance>(_session )) { // Based on List<KeyValuePair<string, int?>> of entities, Get a list per parameter limit //(1000 parameters for an IN condition) of List<int?> entityIds. Dictionary<string, List<List<int?>>> collectionOfEntityIdsPerParameterLimitByEntityType = GetCollectionOfEntityIdsPerParameterLimitByEntityType(entities); string alias = "E"; // In case no entities provided, still need to return records matching // AttributePath if (entities == null || entities.Count == 0) { ICriteria criteria = InitialiseCommonCriteria(session); return new AttributeInstances(criteria.List<AttributeInstance>()); } // foreach entityType - loop through each List containg List<int?> items per parameter limit // and hit the database and load the IAttributeInstances for each list. Then Merge it and when // looped through all return the merged IAttributeInstances. // Note: The Reason of seperate hits to the database with each list of 1000 or less parameters in // the IN condition is to meet the limitation of parameter size in stored procedures which is // 2100. We had attempted to hit database in one go with seperate IN conditions each with a 1000 // parameters or less but that resulted in an error as soon as number of parameters went to more // than 2100. foreach (string entityType in collectionOfEntityIdsPerParameterLimitByEntityType.Keys) { foreach (List<int?> entityIds in collectionOfEntityIdsPerParameterLimitByEntityType[entityType]) { ICriteria criteria = InitialiseCommonCriteria(session); // Add Entity Crieria if (entityIds != null) { AddEntityCriteria(criteria, alias, entityType, entityIds); } // Now that the criteria has been built execute it to resolve the attribute instances // and merge it to the running IAttributeInstances List attributeInstances.Merge(new AttributeInstances(criteria.List<AttributeInstance>())); } } } return attributeInstances; } --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/nhusers?hl=en -~----------~----~----~----~------~----~------~--~---
