private void ProcessCollection( @class hClass, key keyNode, index indexNode, manytomany many, string className, string schema, string tableName, string propertyName, string cascade, AssociationType associationType, string whereClause, collectionFetchMode fetchMode, bool inverse, collectionLazy lazy, string orderByClause) { #region OrderBy string orderByPropertyName = ""; bool orderByIsAsc = true; if (!string.IsNullOrWhiteSpace(orderByClause)) { orderByClause = orderByClause.Trim(); if (orderByClause.EndsWith(" desc", StringComparison.InvariantCultureIgnoreCase)) { orderByIsAsc = false; orderByPropertyName = orderByClause.Substring(0, orderByClause.LastIndexOf(" desc", StringComparison.InvariantCultureIgnoreCase)).Trim(); } else if (orderByClause.EndsWith(" asc", StringComparison.InvariantCultureIgnoreCase)) { orderByIsAsc = false; orderByPropertyName = orderByClause.Substring(0, orderByClause.LastIndexOf(" asc", StringComparison.InvariantCultureIgnoreCase)).Trim(); } else { orderByPropertyName = orderByClause; } } #endregion string indexName = null; if (indexNode != null) { if (indexNode.column != null && indexNode.column.Count() > 0) { indexName = indexNode.column[0].name; } else { indexName = indexNode.column1; } } if (many != null) { var fkColumns = GetColumnNames(many.column, many.Columns()).ToList(); string thisEntityName; string otherEntityName; EntityLoader.IsNameFullyQualified(hClass.name, out thisEntityName); EntityLoader.IsNameFullyQualified(many.@class, out otherEntityName); var collectionInfo = new AssociationInformation { PropertyName = propertyName, ForeignKeyColumnNames = fkColumns, ForeignKeyBelongsToThisTable = !ForeignKeyBelongsToThisTable(hClass, fkColumns), AssociationTableName = new AssociationInformation.TableNameType(schema, tableName), ThisEntityName = thisEntityName, OtherEntityName = otherEntityName, Cardinality = Cardinality.Many, CollectionCascade = ArchAngel.Interfaces.NHibernateEnums.Helper.GetCollectionCascadeType(cascade), CollectionLazy = ArchAngel.Interfaces.NHibernateEnums.Helper.GetCollectionLazyType(lazy.ToString()), CollectionFetchMode = (CollectionFetchModes)Enum.Parse(typeof(CollectionFetchModes), fetchMode.ToString(), true), IndexColumn = indexName, WhereClause = whereClause, AssociationType = associationType, Inverse = inverse ? ArchAngel.Interfaces.NHibernateEnums.BooleanInheritedTypes.@true : ArchAngel.Interfaces.NHibernateEnums.BooleanInheritedTypes.@false, OrderByColumnName = orderByPropertyName, OrderByIsAsc = orderByIsAsc }; associationInformation.Add(collectionInfo); } else { var fkColumns = GetColumnNames(keyNode.column1, keyNode.Columns()).ToList(); string thisEntityName; string otherEntityName; EntityLoader.IsNameFullyQualified(hClass.name, out thisEntityName); EntityLoader.IsNameFullyQualified(className, out otherEntityName); bool topLevelInverse = ArchAngel.Interfaces.SharedData.CurrentProject.GetProjectDefaultInverse(); BooleanInheritedTypes inverseValue = inverse ? BooleanInheritedTypes.@true : BooleanInheritedTypes.@false; if ((inverseValue == BooleanInheritedTypes.@false && topLevelInverse == false) || (inverseValue == BooleanInheritedTypes.@true && topLevelInverse == true)) { inverseValue = BooleanInheritedTypes.inherit_default; } var collectionInfo = new AssociationInformation { PropertyName = propertyName, ForeignKeyColumnNames = fkColumns, ForeignKeyBelongsToThisTable = ForeignKeyBelongsToThisTable(hClass, fkColumns), // GFH ThisEntityName = thisEntityName, OtherEntityName = otherEntityName, Cardinality = Cardinality.Many, CollectionCascade = ArchAngel.Interfaces.NHibernateEnums.Helper.GetCollectionCascadeType(cascade), CollectionLazy = ArchAngel.Interfaces.NHibernateEnums.Helper.GetCollectionLazyType(lazy.ToString()), CollectionFetchMode = (CollectionFetchModes)Enum.Parse(typeof(CollectionFetchModes), fetchMode.ToString(), true), IndexColumn = indexName, AssociationType = associationType, Inverse = inverseValue, OrderByColumnName = orderByPropertyName, OrderByIsAsc = orderByIsAsc }; associationInformation.Add(collectionInfo); } }
public void ProcessReferences(Entity entity, Action <object> addItem) { bool topLevelLazy = ArchAngel.Interfaces.SharedData.CurrentProject.GetProjectDefaultCollectionLazy(); ArchAngel.Interfaces.NHibernateEnums.TopLevelAccessTypes topLevelAccess = ArchAngel.Interfaces.SharedData.CurrentProject.GetProjectDefaultAccess(); ArchAngel.Interfaces.NHibernateEnums.TopLevelCascadeTypes topLevelCascade = ArchAngel.Interfaces.SharedData.CurrentProject.GetProjectDefaultCascade(); ArchAngel.Interfaces.NHibernateEnums.CollectionLazyTypes entityDefaultLazy; ArchAngel.Interfaces.NHibernateEnums.CascadeTypes entityDefaultCascade; ArchAngel.Interfaces.NHibernateEnums.PropertyAccessTypes entityDefaultAccess; NHibernateProjectPreprocessor.GetEntityCollectionDefaults(topLevelLazy, topLevelCascade, topLevelAccess, entity, out entityDefaultLazy, out entityDefaultCascade, out entityDefaultAccess); Dictionary <ITable, int> manyToManySameTableProcessingCounts = new Dictionary <ITable, int>(); foreach (var reference in entity.DirectedReferences.OrderBy(r => r.FromName)) { #region Handle default values #region Cascade string cascade = reference.Entity1IsFromEnd ? reference.Reference.GetReferenceEnd1Cascade().ToString() : reference.Reference.GetReferenceEnd2Cascade().ToString(); if (cascade == ArchAngel.Interfaces.NHibernateEnums.CascadeTypes.inherit_default.ToString()) { cascade = entityDefaultCascade.ToString(); } cascade = cascade.Replace("_", "-"); #endregion #region Lazy string lazy = reference.Entity1IsFromEnd ? reference.Reference.GetReferenceEnd1Lazy().ToString() : reference.Reference.GetReferenceEnd2Lazy().ToString(); if (lazy == CollectionLazyTypes.inherit_default.ToString()) { lazy = entityDefaultLazy.ToString().Replace("@", ""); } lazy = lazy.ToString().Replace("@", ""); #endregion #region CollectionCascade string collectionCascade = reference.Entity1IsFromEnd ? reference.Reference.GetReferenceEnd1CollectionCascade().ToString() : reference.Reference.GetReferenceEnd2CollectionCascade().ToString(); if (collectionCascade == CollectionCascadeTypes.inherit_default.ToString()) { collectionCascade = entityDefaultCascade.ToString(); } collectionCascade = collectionCascade.Replace("_", "-"); #endregion #region Inverse bool topLevelInverse = ArchAngel.Interfaces.SharedData.CurrentProject.GetProjectDefaultInverse(); BooleanInheritedTypes inverseIneritedType = reference.FromEntity == reference.Reference.Entity1 ? reference.Reference.GetReferenceEnd1Inverse() : reference.Reference.GetReferenceEnd2Inverse(); if (inverseIneritedType == BooleanInheritedTypes.inherit_default) { if (topLevelInverse) { inverseIneritedType = BooleanInheritedTypes.@true; } else { inverseIneritedType = BooleanInheritedTypes.@false; } } bool inverse = inverseIneritedType == BooleanInheritedTypes.@true; #endregion #region OrderBy Property orderByProperty = null; string orderByColumnName = ""; bool orderByIsAsc = true; string orderByClause = ""; if (reference.Entity1IsFromEnd) { orderByIsAsc = reference.Reference.GetReferenceEnd1OrderByIsAsc(); orderByProperty = reference.Reference.GetReferenceEnd1OrderByProperty(); } else { orderByIsAsc = reference.Reference.GetReferenceEnd2OrderByIsAsc(); orderByProperty = reference.Reference.GetReferenceEnd2OrderByProperty(); } if (orderByProperty != null) { var col = orderByProperty.MappedColumn(); if (col != null) { orderByColumnName = col.Name; } if (orderByColumnName.Length > 0) { if (orderByIsAsc) { orderByClause = orderByColumnName; } else { orderByClause = orderByColumnName + " desc"; } } } #endregion #endregion switch (DetermineReferenceType(reference.Reference)) { case ReferenceType.OneToOne: ProcessOneToOneReference(entity, reference, addItem, cascade, lazy); break; case ReferenceType.ManyToOne: ProcessManyToOneReference(entity, reference, addItem, cascade, collectionCascade, lazy, orderByClause, inverse); break; case ReferenceType.ManyToMany: ProcessManyToManyReference(entity, reference, addItem, manyToManySameTableProcessingCounts, collectionCascade, lazy, orderByClause, inverse); break; case ReferenceType.Unsupported: throw new NotImplementedException(string.Format("The cardinalities on this reference have not been handled yet: {0} to {1}. (Between {2} and {3})", reference.Reference.Cardinality1, reference.Reference.Cardinality2, reference.FromEntity.Name, reference.ToEntity.Name)); default: throw new ArgumentOutOfRangeException(); } } }