예제 #1
0
        private idbag CreateIdBagNode(DirectedReference reference, key keyNode, string cascade, collectionFetchMode colFetchMode, string lazyString, bool inverse)
        {
            var lazy = (collectionLazy)Enum.Parse(typeof(collectionLazy), lazyString.ToString().Replace("_", ""), true);

            idbag idbagNode = new idbag();

            idbagNode.name    = reference.FromName;
            idbagNode.key     = keyNode;
            idbagNode.cascade = cascade == "none" ? null : cascade;
            idbagNode.inverse = inverse;

            idbagNode.fetchSpecified = colFetchMode != collectionFetchMode.select;
            idbagNode.fetch          = colFetchMode;
            idbagNode.lazySpecified  = lazy != collectionLazy.@true;
            idbagNode.lazy           = (collectionLazy)Enum.Parse(typeof(collectionLazy), lazy.ToString().Replace("_", ""), true);

            var sqlWhereClause = NHCollections.GetSqlWhereClause(reference);

            if (string.IsNullOrEmpty(sqlWhereClause) == false)
            {
                idbagNode.where = sqlWhereClause;
            }

            return(idbagNode);
        }
예제 #2
0
        /// <summary>
        /// Gets the ManyToAny of the Bag if it exists.
        /// </summary>
        /// <param name="theBag"></param>
        /// <returns></returns>
        public static manytoany ManyToAny(this idbag theBag)
        {
            if (theBag.Item != null && theBag.Item is manytoany)
            {
                return((manytoany)theBag.Item);
            }

            return(null);
        }
예제 #3
0
        /// <summary>
        /// Gets the CompositeElement of the set if it exists.
        /// </summary>
        /// <param name="theBag"></param>
        /// <returns></returns>
        public static compositeelement CompositeElement(this idbag theBag)
        {
            if (theBag.Item != null && theBag.Item is compositeelement)
            {
                return((compositeelement)theBag.Item);
            }

            return(null);
        }
예제 #4
0
        /// <summary>
        /// Gets the OneToMany of the Bag if it exists.
        /// </summary>
        /// <param name="theBag"></param>
        /// <returns></returns>
        public static onetomany OneToMany(this idbag theBag)
        {
            if (theBag.Item != null && theBag.Item is onetomany)
            {
                return((onetomany)theBag.Item);
            }

            return(null);
        }
예제 #5
0
        /// <summary>
        /// Gets the Element of the Bag if it exists.
        /// </summary>
        /// <param name="theBag"></param>
        /// <returns></returns>
        public static element Element(this idbag theBag)
        {
            if (theBag.Item != null && theBag.Item is element)
            {
                return((element)theBag.Item);
            }

            return(null);
        }
 protected override void OnProcess(GenerationContext context)
 {
     this.context = context;
     foreach (var e in context.Model.GetEntities())
     {
         logger.Debug(string.Format("{0} working on:", GetType().Name) + e.table);
         if (IsManyToManyJoin(e))
         {
             var kc = GetKeyColumns(context.GetTableMetaData(e.schema, e.name));
             bool hasbag = false;
             if (kc.Length == 2)//bag: key spawn two columns
             {
                 hasbag = true;
                 manytoone[] refs = context.Model.GetManyToOnesOfEntity(e.name);
                 for( int i=0;i<refs.Length;++i )
                 {
                     int other = i == 0?1:0;
                     set set = new set();
                     set.table = e.table;
                     set.schema = e.schema;
                     set.catalog = e.catalog;
                     set.name = context.NamingStrategy.GetNameForCollection(refs[other].@class,0);
                     set.key = new key() { column1 = refs[i].column };
                     set.Item = new manytomany()
                         {
                             @class = refs[other].@class
                             ,Items = new column[]{ new column(){ name = refs[other].column}}
                         };
                     context.Model.AddCollectionToEntity(refs[i].@class,set);
                     logger.Warn(string.Format("Collection {0} on entity {1} is a many to many, need 'inverse' to be specified?",set.name,refs[i].@class));
                 }
             }
             else
             if( kc.Length==1 ) //idbag: a single column with the pair id.
             {
                 hasbag = true;
                 manytoone[] refs = context.Model.GetManyToOnesOfEntity(e.name);
                 for (int i = 0; i < refs.Length; ++i)
                 {
                     int other = i == 0 ? 1 : 0;
                     idbag idbag = new idbag();
                     idbag.collectionid = new collectionid()
                             {
                                 column1 = kc[0].Name
                                 ,
                                 type = typeConverter.GetNHType(kc[0])
                                 ,
                                 length = kc[0].ColumnSize > 0 ? kc[0].ColumnSize.ToString() : null
                                 ,
                                 generator = new generator() { @class = "native" }
                             };
                     logger.Warn(string.Format("IdBag collection {0} on entity {1}: collection key generator defaults to native",idbag.name,refs[i].@class));
                     idbag.table = e.table;
                     idbag.schema = e.schema;
                     idbag.catalog = e.catalog;
                     idbag.name = context.NamingStrategy.GetNameForCollection(refs[other].@class, 0);
                     idbag.key = new key() { column1 = refs[i].column };
                     idbag.Item = new manytomany()
                     {
                         @class = refs[other].@class
                         ,
                         Items = new column[] { new column() { name = refs[other].column } }
                     };
                     context.Model.AddCollectionToEntity(refs[i].@class, idbag);
                     logger.Warn(string.Format("Collection {0} on entity {1} is a many to many, need 'inverse' to be specified?", idbag.name, refs[i].@class));
                 }
             }
             if (hasbag)
             {
                 RemoveCurrentCollections(e);
                 context.Model.RemoveEntity(e.name);
             }
         }
     }
 }
예제 #7
0
 protected override void OnProcess(GenerationContext context)
 {
     this.context = context;
     foreach (var e in context.Model.GetEntities())
     {
         logger.Debug(string.Format("{0} working on:", GetType().Name) + e.table);
         if (IsManyToManyJoin(e))
         {
             var  kc     = GetKeyColumns(context.GetTableMetaData(e.schema, e.table));
             bool hasbag = false;
             if (kc.Length == 2)//bag: key spawn two columns
             {
                 hasbag = true;
                 manytoone[] refs = context.Model.GetManyToOnesOfEntity(e.name);
                 for (int i = 0; i < refs.Length; ++i)
                 {
                     int other = i == 0?1:0;
                     set set   = new set();
                     set.table   = e.table;
                     set.schema  = e.schema;
                     set.catalog = e.catalog;
                     set.name    = context.NamingStrategy.GetNameForCollection(refs[other].@class, 0);
                     set.key     = new key()
                     {
                         column1 = refs[i].column
                     };
                     set.Item = new manytomany()
                     {
                         @class  = refs[other].@class
                         , Items = new column[] { new column()
                                                  {
                                                      name = refs[other].column
                                                  } }
                     };
                     context.Model.AddCollectionToEntity(refs[i].@class, set);
                     logger.Warn(string.Format("Collection {0} on entity {1} is a many to many, need 'inverse' to be specified?", set.name, refs[i].@class));
                 }
             }
             else
             if (kc.Length == 1) //idbag: a single column with the pair id.
             {
                 hasbag = true;
                 manytoone[] refs = context.Model.GetManyToOnesOfEntity(e.name);
                 for (int i = 0; i < refs.Length; ++i)
                 {
                     int   other = i == 0 ? 1 : 0;
                     idbag idbag = new idbag();
                     idbag.collectionid = new collectionid()
                     {
                         column1 = kc[0].Name
                         ,
                         type = typeConverter.GetNHType(kc[0])
                         ,
                         length = kc[0].ColumnSize > 0 ? kc[0].ColumnSize.ToString() : null
                         ,
                         generator = new generator()
                         {
                             @class = "native"
                         }
                     };
                     logger.Warn(string.Format("IdBag collection {0} on entity {1}: collection key generator defaults to native", idbag.name, refs[i].@class));
                     idbag.table   = e.table;
                     idbag.schema  = e.schema;
                     idbag.catalog = e.catalog;
                     idbag.name    = context.NamingStrategy.GetNameForCollection(refs[other].@class, 0);
                     idbag.key     = new key()
                     {
                         column1 = refs[i].column
                     };
                     idbag.Item = new manytomany()
                     {
                         @class = refs[other].@class
                         ,
                         Items = new column[] { new column()
                                                {
                                                    name = refs[other].column
                                                } }
                     };
                     context.Model.AddCollectionToEntity(refs[i].@class, idbag);
                     logger.Warn(string.Format("Collection {0} on entity {1} is a many to many, need 'inverse' to be specified?", idbag.name, refs[i].@class));
                 }
             }
             if (hasbag)
             {
                 RemoveCurrentCollections(e);
                 context.Model.RemoveEntity(e.name);
             }
         }
     }
 }
예제 #8
0
        private void ProcessManyToOneReference(
            Entity entity,
            DirectedReference directedReference,
            Action <object> addItem,
            string cascade,
            string collectionCascade,
            string lazy,
            string orderByClause,
            bool inverse)
        {
            if (directedReference.FromEndEnabled == false)
            {
                return;
            }

            ITable referenceMappedTable = directedReference.Reference.MappedTable();
            DirectedRelationship directedRelationship = null;

            if (referenceMappedTable == null)
            {
                directedRelationship = GetDirectedMappedRelationship(entity, directedReference.Reference);
            }

            if (directedReference.FromEndCardinality == Cardinality.One)
            {
                fetchMode fetchMode;
                bool      insert;
                bool      update;

                if (directedReference.Entity1IsFromEnd)
                {
                    fetchMode = (fetchMode)Enum.Parse(typeof(fetchMode), directedReference.Reference.GetReferenceEnd1FetchMode().ToString(), true);
                    insert    = directedReference.Reference.GetReferenceEnd1Insert();
                    update    = directedReference.Reference.GetReferenceEnd1Update();
                }
                else
                {
                    fetchMode = (fetchMode)Enum.Parse(typeof(fetchMode), directedReference.Reference.GetReferenceEnd2FetchMode().ToString(), true);
                    insert    = directedReference.Reference.GetReferenceEnd2Insert();
                    update    = directedReference.Reference.GetReferenceEnd2Update();
                }
                manytoone manyToOneNode;

                if (referenceMappedTable == null)
                {
                    manyToOneNode = CreateManyToOneNode(directedReference, directedRelationship, cascade);
                }
                else
                {
                    manyToOneNode = CreateManyToOneNode(directedReference, referenceMappedTable);
                }

                manyToOneNode.fetch          = fetchMode;
                manyToOneNode.fetchSpecified = true;
                manyToOneNode.insert         = insert;
                manyToOneNode.update         = update;

                addItem(manyToOneNode);
            }
            else
            {
                key keyNode = new key();

                if (referenceMappedTable == null &&
                    directedRelationship.ToKey.Columns.Count > 1)
                {
                    foreach (var columnNode in GetColumnNodes(directedRelationship.ToKey.Columns))
                    {
                        keyNode.AddColumn(columnNode);
                    }
                }
                else if (referenceMappedTable != null)
                {
                    ITable toPrimaryMappedTable  = EntityMapper.GetPrimaryTable(directedReference.ToEntity);
                    var    toColumnsInPrimaryKey = referenceMappedTable.Relationships.First(t => t.PrimaryTable == toPrimaryMappedTable || t.ForeignTable == toPrimaryMappedTable).ForeignKey.Columns;

                    foreach (var columnNode in GetColumnNodes(toColumnsInPrimaryKey))
                    {
                        keyNode.AddColumn(columnNode);
                    }
                }
                else
                {
                    keyNode.column1 = directedRelationship.ToKey.Columns[0].Name.BackTick();
                }

                onetomany oneToManyNode = new onetomany();
                oneToManyNode.@class = directedReference.ToEntity.Name;

                collectionFetchMode collFetchMode;

                if (directedReference.Entity1IsFromEnd)
                {
                    collFetchMode = (collectionFetchMode)Enum.Parse(typeof(collectionFetchMode), directedReference.Reference.GetReferenceEnd1CollectionFetchMode().ToString(), true);
                }
                else
                {
                    collFetchMode = (collectionFetchMode)Enum.Parse(typeof(collectionFetchMode), directedReference.Reference.GetReferenceEnd2CollectionFetchMode().ToString(), true);
                }

                AssociationType type = NHCollections.GetAssociationType(directedReference);

                switch (type)
                {
                case AssociationType.None:
                    Log.WarnFormat("No association type was set on reference {0} for the end {1}. This is usually an error.", directedReference.Reference.Name, directedReference.Entity1IsFromEnd ? "1" : "2");
                    return;

                case AssociationType.Set:
                    var set = CreateSetNode(directedReference, keyNode, collectionCascade, collFetchMode, lazy, inverse);
                    set.Item = oneToManyNode;

                    if (orderByClause.Length > 0)
                    {
                        set.orderby = orderByClause;
                    }

                    addItem(set);
                    break;

                case AssociationType.Map:
                    var mapNode = CreateMapNode(directedReference, keyNode, collectionCascade, collFetchMode, lazy, inverse);
                    mapNode.Item = new index
                    {
                        column1 = NHCollections.GetIndexColumnName(directedReference),
                        type    = NHCollections.GetIndexColumnTypeName(directedReference, EntityMapper.GetPrimaryTable(directedReference.ToEntity))
                    };
                    mapNode.Item1 = oneToManyNode;

                    if (orderByClause.Length > 0)
                    {
                        mapNode.orderby = orderByClause;
                    }

                    addItem(mapNode);
                    break;

                case AssociationType.Bag:
                    var bag = CreateBagNode(directedReference, keyNode, collectionCascade, collFetchMode, lazy, inverse);
                    bag.Item = oneToManyNode;

                    if (orderByClause.Length > 0)
                    {
                        bag.orderby = orderByClause;
                    }

                    addItem(bag);
                    break;

                case AssociationType.List:
                    list listNode = CreateListNode(directedReference, keyNode, collectionCascade, collFetchMode, lazy, inverse);
                    listNode.Item = new index {
                        column1 = NHCollections.GetIndexColumnName(directedReference)
                    };
                    listNode.Item1 = oneToManyNode;

                    if (orderByClause.Length > 0)
                    {
                        listNode.orderby = orderByClause;
                    }

                    addItem(listNode);
                    break;

                case AssociationType.IDBag:
                    idbag idbagNode = CreateIdBagNode(directedReference, keyNode, collectionCascade, collFetchMode, lazy, inverse);
                    idbagNode.collectionid = new collectionid
                    {
                        column1   = NHCollections.GetIndexColumnName(directedReference),
                        generator = new generator {
                            @class = "sequence"
                        },
                        type = NHCollections.GetIndexColumnTypeName(directedReference, EntityMapper.GetPrimaryTable(directedReference.ToEntity))
                    };

                    addItem(idbagNode);
                    break;

                default:
                    throw new ArgumentOutOfRangeException("AssociationType not handled yet: " + type.ToString());
                }
            }
        }