Exemple #1
0
 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;
 }
Exemple #4
0
 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);
 }
Exemple #5
0
 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);
        }
Exemple #9
0
        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);
        }
Exemple #10
0
        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);
            }
        }
Exemple #11
0
 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);
 }
Exemple #15
0
        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);
        }
Exemple #16
0
        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);
                    }
                }
            }
        }
Exemple #17
0
 public void RemoveManyToOne(string entityName, manytoone manytoone)
 {
     manyToOnesByEntity[entityName].Remove(manytoone);
 }