>From your original post it looks like there is a version of AddEntityCriteria >that takes a List<int?> as a parameter.
-----Original Message----- From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Jatin Sent: Monday, November 10, 2008 8:46 PM To: nhusers Subject: [nhusers] Re: System.InvalidOperationException. Collection was modified; enumeration operation may not execute Hi Jon Here is the AddEntityCriteria() source code.Pl let me know if u need any more info. Thanks private void AddEntityCriteria(ICriteria parentCriteria, string alias, string entityTypeName, int? entityId) { if (!string.IsNullOrEmpty(entityTypeName) || entityId.HasValue) { string setAlias = "ASI"; ICriteria entityCriteria = parentCriteria.CreateCriteria( string.Format("{0}.{1}", alias, enumAttributeInstance.AttributeSetInstance), setAlias, JoinType.InnerJoin); if (!string.IsNullOrEmpty(entityTypeName)) { entityCriteria.Add(new NHibernate.Expression.EqExpression( string.Format("{0}.{1}", setAlias, enumAttributeSetInstance.EntityTypeName), entityTypeName)); } if (entityId.HasValue) { entityCriteria.Add(new NHibernate.Expression.EqExpression( string.Format("{0}.{1}", setAlias, enumAttributeSetInstance.EntityId), entityId.Value)); } } } On Nov 11, 5:38 pm, "Jon Palmer" <[EMAIL PROTECTED]> wrote: > 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; > }- Hide quoted text - > > - Show quoted text - --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
