Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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();
                }
            }
        }