private manytoone CreateManyToOne(IForeignKeyColumnInfo iForeignKeyColumnInfo,@class referredClass) { manytoone mto = new manytoone(); mto.column = iForeignKeyColumnInfo.ForeignKeyColumnName; mto.@class = referredClass.name; mto.name = currentContext.NamingStrategy.GetNameForManyToOne(referredClass.name, new string[] { iForeignKeyColumnInfo.ForeignKeyColumnName }); return SetIfNullable(mto,new IForeignKeyColumnInfo[]{iForeignKeyColumnInfo}); }
private manytoone CreateManyToOne(IForeignKeyColumnInfo iForeignKeyColumnInfo, @class referredClass) { manytoone mto = new manytoone(); mto.column = iForeignKeyColumnInfo.ForeignKeyColumnName; mto.@class = referredClass.name; mto.name = currentContext.NamingStrategy.GetNameForManyToOne(referredClass.name, new string[] { iForeignKeyColumnInfo.ForeignKeyColumnName }); return(SetIfNullable(mto, new IForeignKeyColumnInfo[] { iForeignKeyColumnInfo })); }
public manytoone AddManyToOneToEntity(string entity,manytoone mto) { if (!manyToOnesByEntity.ContainsKey(entity)) { manyToOnesByEntity[entity] = new List<manytoone>(); } manyToOnesByEntity[entity].Add(mto); return mto; }
private manytoone CreateManyToOne(IForeignKeyColumnInfo[] keyManyToOne, @class referredClass) { manytoone mto = new manytoone(); mto.Items = keyManyToOne.Select(q => new column(){ name=q.ForeignKeyColumnName}).ToArray(); mto.@class = referredClass.name; mto.name = currentContext.NamingStrategy.GetNameForManyToOne(referredClass.name , keyManyToOne.Select(q=>q.ForeignKeyColumnName).ToArray() ); return SetIfNullable(mto,keyManyToOne); }
public manytoone AddManyToOneToEntity(string entity, manytoone mto) { if (!manyToOnesByEntity.ContainsKey(entity)) { manyToOnesByEntity[entity] = new List <manytoone>(); } manyToOnesByEntity[entity].Add(mto); return(mto); }
private manytoone CreateManyToOne(IForeignKeyColumnInfo[] keyManyToOne, @class referredClass) { manytoone mto = new manytoone(); mto.Items = keyManyToOne.Select(q => new column() { name = q.ForeignKeyColumnName }).ToArray(); mto.@class = referredClass.name; mto.name = currentContext.NamingStrategy.GetNameForManyToOne(referredClass.name , keyManyToOne.Select(q => q.ForeignKeyColumnName).ToArray()); return(SetIfNullable(mto, keyManyToOne)); }
internal static void SetUniqueProperties(MemberInfo memberInfo, manytoone manytoone) { SetUniqueProperties(memberInfo, ua => { var column = manytoone.column.SingleOrDefault(); if (column != null) { column.notnull = ua.NotNull; column.uniquekey = ua.KeyName ?? ("UQ_" + memberInfo.DeclaringType.Name); } { manytoone.notnull = ua.NotNull; manytoone.uniquekey = ua.KeyName ?? ("UQ_" + memberInfo.DeclaringType.Name); } }); }
public static List <column> Columns(this manytoone manytoone) { List <column> columns = new List <column>(); if (manytoone.Items == null) { return(columns); } foreach (column col in manytoone.Items.Where(i => i is column)) { columns.Add(col); } return(columns); }
private manytoone CreateManyToOneNode(DirectedReference directedReference, ITable referenceMappedTable) { 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 = new manytoone(); manyToOneNode.@class = directedReference.ToEntity.Name; manyToOneNode.name = directedReference.FromName; //bool notNullableColumnsExist = directedRelationship.MappedColumns.Any(mc => !mc.Source.IsNullable); manyToOneNode.notnull = true; manyToOneNode.notnullSpecified = true; manyToOneNode.fetch = fetchMode; manyToOneNode.fetchSpecified = true; manyToOneNode.insert = insert; manyToOneNode.update = update; ITable fromPrimaryMappedTable = EntityMapper.GetPrimaryTable(directedReference.FromEntity); List <IColumn> fromKeyColumns = referenceMappedTable.Relationships.First(t => t.PrimaryTable == fromPrimaryMappedTable || t.ForeignTable == fromPrimaryMappedTable).ForeignKey.Columns.ToList(); if (fromKeyColumns.Count > 1) { foreach (var columnNode in GetColumnNodes(fromKeyColumns)) { manyToOneNode.AddColumn(columnNode); } } else { manyToOneNode.column = fromKeyColumns[0].Name.BackTick(); } return(manyToOneNode); }
private void ProcessOneToOneReference(Entity entity, DirectedReference directedReference, Action <object> addItem, string cascade, string lazy) { if (directedReference.FromEndEnabled == false) { return; } DirectedRelationship directedRelationship = GetDirectedMappedRelationship(entity, directedReference.Reference); fetchMode fetchMode; if (directedReference.Entity1IsFromEnd) { fetchMode = (fetchMode)Enum.Parse(typeof(fetchMode), directedReference.Reference.GetReferenceEnd1FetchMode().ToString(), true); } else { fetchMode = (fetchMode)Enum.Parse(typeof(fetchMode), directedReference.Reference.GetReferenceEnd2FetchMode().ToString(), true); } // if this side has the foreign key, it gets the many to one node if (directedRelationship.FromKey.Keytype == DatabaseKeyType.Foreign) { manytoone manyToOneNode = CreateManyToOneNode(directedReference, directedRelationship, cascade); manyToOneNode.unique = true; manyToOneNode.fetch = fetchMode; manyToOneNode.fetchSpecified = true; addItem(manyToOneNode); } else { onetoone oneToOneNode = new onetoone(); oneToOneNode.@class = directedReference.ToEntity.Name; oneToOneNode.name = directedReference.FromName; oneToOneNode.propertyref = directedReference.ToName; oneToOneNode.fetch = fetchMode; oneToOneNode.fetchSpecified = true; addItem(oneToOneNode); } }
private manytoone SetIfNullable(manytoone mto, IForeignKeyColumnInfo[] iForeignKeyColumnInfo) { bool notnull = true; foreach (var fk in iForeignKeyColumnInfo) { var meta = currentContext.GetTableMetaData(fk.ForeignKeyTableCatalog, fk.ForeignKeyTableSchema, fk.ForeignKeyTableName); if( null != meta ) { var cinfo = meta.GetColumnMetadata(fk.ForeignKeyColumnName); if (true.ParseFromDb(cinfo.Nullable) == true) { notnull = false; break; } } } mto.notnull = notnull; mto.notnullSpecified = mto.notnull; return mto; }
private manytoone SetIfNullable(manytoone mto, IForeignKeyColumnInfo[] iForeignKeyColumnInfo) { bool notnull = true; foreach (var fk in iForeignKeyColumnInfo) { var meta = currentContext.GetTableMetaData(fk.ForeignKeyTableCatalog, fk.ForeignKeyTableSchema, fk.ForeignKeyTableName); if (null != meta) { var cinfo = meta.GetColumnMetadata(fk.ForeignKeyColumnName); if (true.ParseFromDb(cinfo.Nullable) == true) { notnull = false; break; } } } mto.notnull = notnull; mto.notnullSpecified = mto.notnull; return(mto); }
public static void AddColumn(this manytoone thisManyToOne, column column) { //throw new NotImplementedException("TODO: What are we meant to do here?"); //if (thisManyToOne.column == null) // thisManyToOne.column = new column[0]; //var items = thisManyToOne.column; //Array.Resize(ref items, thisManyToOne.column.Length + 1); //items[items.Length - 1] = column; //thisManyToOne.column = items; if (thisManyToOne.Items == null) { thisManyToOne.Items = new column[0]; } var items = thisManyToOne.Items; Array.Resize(ref items, thisManyToOne.Items.Length + 1); items[items.Length - 1] = column; thisManyToOne.Items = items; }
public void RemoveManyToOne(string entityName, manytoone manytoone) { manyToOnesByEntity[entityName].Remove(manytoone); }
private manytoone CreateManyToOneNode(DirectedReference directedReference, DirectedRelationship directedRelationship, string cascade) { 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 = new manytoone(); manyToOneNode.@class = directedReference.ToEntity.Name; manyToOneNode.name = directedReference.FromName; bool notNullableColumnsExist = directedRelationship.MappedColumns.Any(mc => !mc.Source.IsNullable); manyToOneNode.notnull = notNullableColumnsExist; manyToOneNode.notnullSpecified = true; manyToOneNode.fetch = fetchMode; manyToOneNode.fetchSpecified = true; manyToOneNode.insert = insert; manyToOneNode.update = update; manyToOneNode.cascade = cascade == "none" ? null : cascade; if (directedRelationship.ToTable == directedRelationship.FromTable) { if (directedRelationship.ToKey.Keytype == Providers.EntityModel.Helper.DatabaseKeyType.Primary) { if (directedRelationship.FromKey.Columns.Count > 1) { foreach (var column in GetColumnNodes(directedRelationship.FromKey.Columns)) { manyToOneNode.AddColumn(column); } } else { manyToOneNode.column = directedRelationship.FromKey.Columns[0].Name.BackTick(); } } else if (directedRelationship.ToKey.Columns.Count > 1) { foreach (var column in GetColumnNodes(directedRelationship.ToKey.Columns)) { manyToOneNode.AddColumn(column); } } else { manyToOneNode.column = directedRelationship.ToKey.Columns[0].Name.BackTick(); } } else { if (directedRelationship.FromKey.Columns.Count > 1) { foreach (var column in GetColumnNodes(directedRelationship.FromKey.Columns)) { manyToOneNode.AddColumn(column); } } else { manyToOneNode.column = directedRelationship.FromKey.Columns[0].Name.BackTick(); } } return(manyToOneNode); }
public void Apply(Type type, @class @class, IEnumerable <Type> entityTypes, hibernatemapping hbm) { var entityMembersOnType = type.GetFieldsAndProperties().Where(p => entityTypes.Contains(p.ReturnType())).ToArray(); foreach (var memberInfo in entityMembersOnType) { var prefix = ColumnNamePrefix(memberInfo); var entityClassElement = memberInfo.ReturnType().ClassElement(hbm); var manyToOne = new manytoone() { name = memberInfo.Name.Sanitise(), column = entityClassElement.id.column.Copy() .Each(c => c.SetName(prefix + c.GetName())) .Each(c => c.index = null) .Each(c => c.notnull = !memberInfo.IsNullable()).ToList(), access = memberInfo.Access(), }; manyToOne.foreignkey = "FK_" + @class.table.Trim('[', ']') + "_" + string.Join("_", manyToOne.column.Select(c => c.name.Trim("[]".ToCharArray()))) + "_to_" + memberInfo.ReturnType().Name.Sanitise(); UniqueAttribute.SetUniqueProperties(memberInfo, manyToOne); @class.manytoone.Add(manyToOne); //if there is a manytoone, there is probably a set on the other object... var potentialCorrespondingCollections = memberInfo.ReturnType().GetAllMembers() //... so we get the collections on the other type .Where(p => setTypes.MakeGenericTypes(type).Any(t => t.IsAssignableFrom(p.ReturnType()))); if (potentialCorrespondingCollections.Count() > 1) { var att = memberInfo.GetCustomAttributes(typeof(ManyToOneHintAttribute), false).SingleOrDefault() as ManyToOneHintAttribute; if (att != null) { potentialCorrespondingCollections = potentialCorrespondingCollections.Where(p => p.Name == att.CorrespondingCollectionName); } } if (potentialCorrespondingCollections.Count() > 1) { throw new Exception("Meow! There is more than 1 collection that might be the inverse! You may need to add a ManyToOneHintAttribute so we know which one to use"); } if (potentialCorrespondingCollections.Count() == 1) { var correspondingCollection = potentialCorrespondingCollections.Single(); if (setTypes.MakeGenericTypes(type).Any(t => t.IsAssignableFrom(correspondingCollection.ReturnType()))) { var set = new set() { name = correspondingCollection.Name, access = correspondingCollection.Access(), key = new key() { column1 = manyToOne.column.Single().name, foreignkey = "FK_" + @class.table.Trim('[', ']') + "_" + string.Join("_", manyToOne.column.Select(c => c.name.Trim("[]".ToCharArray()))) + "_to_" + memberInfo.ReturnType().ClassElement(hbm).table, notnull = false // so inverse works!memberInfo.IsNullable(), }, inverse = true, onetomany = new onetomany() { @class = type.AssemblyQualifiedName }, cascade = "all", }; manyToOne.column.Each(c => c.notnull = false).ToArray(); var otherClassMap = memberInfo.ReturnType().ClassElement(hbm); otherClassMap.set.Add(set); } } } }