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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); } } } }
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); } } } }
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()); } } }