Example #1
0
        /// <summary>
        /// Generates the mapping files
        /// </summary>
        /// <param name="entityNames"></param>
        /// <param name="tableNames">String array with table names</param>
        /// <param name="alColumns">ArrayList with columns for each table name</param>
        /// <param name="alTableRelations"></param>
        /// <param name="fileName">The file path</param>
        /// <param name="namespaceName">Namespace name</param>
        public void GenerateTableMetadatata(string[] entityNames, string[] tableNames, ArrayList alColumns, ArrayList alTableRelations, string fileName, string namespaceName)
        {
            if (entityNames.Length != alColumns.Count)
            {
                throw new ArgumentException();
            }

            if (!fileName.EndsWith(".cs"))
            {
                fileName = fileName + ".cs";
            }


            FileStream   fs = null;
            StreamWriter sw = null;

            try
            {
                if (File.Exists(fileName))
                {
                    fs = new FileStream(fileName, FileMode.Truncate, FileAccess.Write);
                }
                else
                {
                    fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);
                }

                sw = new StreamWriter(fs);

                namespaceName = Utilies.RemoveEmptySpaces(namespaceName);

                //write header;
                sw.WriteLine("using System;");
                sw.WriteLine("using System.Data;");
                sw.WriteLine("using voidsoft.DataBlock;");


                sw.WriteLine("");
                sw.WriteLine("namespace " + namespaceName);
                sw.WriteLine("{");

                for (int i = 0; i < entityNames.Length; i++)
                {
                    entityNames[i] = Utilies.RemoveEmptySpaces(entityNames[i].Trim());

                    DatabaseColumn[] column = (DatabaseColumn[])alColumns[i];

                    sw.WriteLine("");
                    sw.WriteLine("      [Serializable()]");
                    sw.WriteLine("		public partial class "+ entityNames[i] + " : TableMetadata");
                    sw.WriteLine("		{");
                    sw.WriteLine("");

                    #region generate the internal enum with myFields

                    sw.WriteLine("                   public enum " + entityNames[i] + "Fields");
                    sw.WriteLine("                   {");

                    for (int ij = 0; ij < column.Length; ij++)
                    {
                        if (ij == column.Length - 1)
                        {
                            sw.WriteLine("                      " + column[ij].Name);
                        }
                        else
                        {
                            sw.WriteLine("                      " + column[ij].Name + ",");
                        }
                    }

                    sw.WriteLine("                  }");

                    #endregion

                    sw.WriteLine("");
                    sw.WriteLine("");


                    sw.WriteLine("			    private DatabaseField[] myFields;");
                    sw.WriteLine("");

                    #region generate ctor

                    sw.WriteLine("		    	public "+ entityNames[i] + "()");
                    sw.WriteLine("			    {");
                    sw.WriteLine("					    myFields = new DatabaseField["+ column.Length + "];");

                    string isPrimaryKey;
                    string isAutoIncremented;


                    for (int x = 0; x < column.Length; x++)
                    {
                        string dataType = column[x].columnDataType;

                        //check the type. If it's a byte[] "rename" it to

                        if (dataType.Trim() == "System.Byte[]")
                        {
                            dataType = "System.Binary";
                        }

                        isPrimaryKey      = column[x].isPrimaryKey.ToString();
                        isAutoIncremented = column[x].isAutoIncremented.ToString();

                        //make it lower case for C#
                        isPrimaryKey      = isPrimaryKey.ToLower();
                        isAutoIncremented = isAutoIncremented.ToLower();

                        sw.WriteLine("                    myFields[" + x + "] = new DatabaseField(DbType." + dataType.Substring(dataType.IndexOf(".") + 1) + ",\"" + column[x].Name + "\"," + isPrimaryKey + "," + isAutoIncremented + "," + "null);");
                    }

                    sw.WriteLine(" ");
                    sw.WriteLine("                        this.currentTableName = \"" + tableNames[i] + "\";");
                    sw.WriteLine("");

                    List <TableRelation> relations = (List <TableRelation>)alTableRelations[i];

                    #region generate relations

                    for (int j = 0; j < relations.Count; j++)
                    {
                        //check the realtion type

                        if (relations[j] is ParentTableRelation)
                        {
                            ParentTableRelation pp = (ParentTableRelation)relations[j];

                            sw.WriteLine("this.listRelations.Add(new ParentTableRelation(\"" + pp.RelatedTableName + "\", \"" + pp.ForeignKeyName + "\"," + "TableRelationCardinality." + pp.RelationCardinality.ToString() + "," + pp.CascadeDeleteChildren.ToString().ToLower() + "));");
                        }
                        else if (relations[j] is ChildTableRelation)
                        {
                            ChildTableRelation ch = (ChildTableRelation)relations[j];
                            sw.WriteLine("this.listRelations.Add(new ChildTableRelation(\"" + ch.RelatedTableName + "\",TableRelationCardinality.OneToOne,\"" + ch.RelatedTableKeyName + "\",\"" + ch.ForeignKeyName + "\"));");
                        }
                        else
                        {
                            //many to many
                            ManyToManyTableRelation mm = (ManyToManyTableRelation)relations[j];
                            sw.WriteLine("this.listRelations.Add(new ManyToManyTableRelation(\"" + mm.RelatedTableName + "\",\"" + mm.IntermediaryTableName + "\",\"" + mm.IntermediaryKeyFieldFromParentTable + "\",\"" + mm.IntermediaryKeyFieldFromChildTable + "\"));");
                        }
                    }


                    sw.WriteLine("");
                    sw.WriteLine("                  }"); //end ctor brace.

                    #endregion

                    #endregion

                    //generate DatabasemyFields

                    sw.WriteLine("");
                    sw.WriteLine("");

                    sw.WriteLine("			public override DatabaseField[] TableFields ");
                    sw.WriteLine("			{");
                    sw.WriteLine("				get{ return myFields;}");
                    sw.WriteLine("				set{myFields = value;}");
                    sw.WriteLine("			}");

                    #region Clone

                    sw.WriteLine("          public " + entityNames[i] + " Clone()");
                    sw.WriteLine("          {");
                    sw.WriteLine("                 return this.Clone<" + entityNames[i] + ">();");
                    sw.WriteLine("          }");

                    #endregion

                    #region generate properties with nullable data types

                    for (int x = 0; x < column.Length; x++)
                    {
                        //generate a empty byte[]
                        if (column[x].columnDataType == "System.Byte[]")
                        {
                            sw.WriteLine("");
                            sw.WriteLine("public " + column[x].columnDataType + " " + column[x].Name);
                            sw.WriteLine("{");
                            sw.WriteLine("    get");
                            sw.WriteLine("    {");
                            sw.WriteLine("         object result = (this.GetField(\"" + column[x].Name + "\")).fieldValue;");
                            sw.WriteLine("         if(result == null)");
                            sw.WriteLine("         {");
                            sw.WriteLine("              return new System.Byte[0];");
                            sw.WriteLine("         }");
                            sw.WriteLine("");
                            sw.WriteLine("          return (" + column[x].columnDataType + ") result;"); // + " (this.GetField(\"" + column[x].Name + "\")).fieldValue;");
                            sw.WriteLine("    }");
                            sw.WriteLine("");
                            sw.WriteLine("    set");
                            sw.WriteLine("    {");
                            sw.WriteLine("          this.SetFieldValue(\"" + column[x].Name + "\", value);");
                            sw.WriteLine("    }");
                            sw.WriteLine("}");
                            sw.WriteLine("");
                        }
                        else if (column[x].columnDataType == "System.String")
                        {
                            sw.WriteLine("");

                            //generate validation attributes
                            if (generateValidationAttributes)
                            {
                                //not null
                                if (!column[x].allowsNull)
                                {
                                    //sw.WriteLine("[EvilAttributes.ValidateRequired(" + column[x].Name + "Null" + ")]");
                                }

                                //also add size check
                                //sw.WriteLine("[EvilAttributes.ValidateMaxLength(" + column[x].fieldLength + ", " + column[x].Name + "MaxLength" + ")]");
                            }

                            sw.WriteLine("public " + column[x].columnDataType + " " + column[x].Name);
                            sw.WriteLine("{");
                            sw.WriteLine("    get");
                            sw.WriteLine("    {");
                            sw.WriteLine("         object result = this.GetField(\"" + column[x].Name + "\").fieldValue; ");
                            sw.WriteLine("         return (result != null) ? result.ToString() : null;");
                            sw.WriteLine("    }");
                            sw.WriteLine("");
                            sw.WriteLine("    set");
                            sw.WriteLine("    {");
                            sw.WriteLine("          this.SetFieldValue(\"" + column[x].Name + "\", value);");
                            sw.WriteLine("    }");
                            sw.WriteLine("}");
                            sw.WriteLine("");
                        }
                        else
                        {
                            //generate nullable types for the rest of the columns

                            if (generateValidationAttributes)
                            {
                                if (!column[x].allowsNull)
                                {
                                    // sw.WriteLine("[EvilAttributes.ValidateRequired(" + column[x].Name + "Null" + ")]");
                                }
                            }


                            if (column[x].allowsNull)
                            {
                                sw.WriteLine("");
                                sw.WriteLine("public " + column[x].columnDataType + "? " + column[x].Name);
                                sw.WriteLine("{");
                                sw.WriteLine("    get");
                                sw.WriteLine("    {");
                                sw.WriteLine("         object result = this.GetField(\"" + column[x].Name + "\").fieldValue; ");

                                sw.WriteLine(" return (result == null || result == DBNull.Value) ? null : (" + column[x].columnDataType + "?) result;");
                                sw.WriteLine("    }");
                                sw.WriteLine("");
                                sw.WriteLine("    set");
                                sw.WriteLine("    {");
                                sw.WriteLine("          this.SetFieldValue(\"" + column[x].Name + "\", value);");
                                sw.WriteLine("    }");
                                sw.WriteLine("}");
                                sw.WriteLine("");
                            }
                            else
                            {
                                sw.WriteLine("");
                                sw.WriteLine("public " + column[x].columnDataType + " " + column[x].Name);
                                sw.WriteLine("{");
                                sw.WriteLine("    get");
                                sw.WriteLine("    {");
                                sw.WriteLine("        return (" + column[x].columnDataType + ") this.GetField(\"" + column[x].Name + "\").fieldValue; ");
                                sw.WriteLine("    }");
                                sw.WriteLine("");
                                sw.WriteLine("    set");
                                sw.WriteLine("    {");
                                sw.WriteLine("          this.SetFieldValue(\"" + column[x].Name + "\", value);");
                                sw.WriteLine("    }");
                                sw.WriteLine("}");
                                sw.WriteLine("");
                            }
                        }
                    }

                    #endregion

                    #region Generate Get methods

                    //generate "Get" methods implementation;

                    for (int j = 0; j < relations.Count; j++)
                    {
                        //check the realtion type

                        if (relations[j] is ParentTableRelation)
                        {
                            ParentTableRelation pp = (ParentTableRelation)relations[j];

                            if (pp.RelationCardinality == RelationCardinality.OneToOne)
                            {
                                sw.WriteLine("public TableMetadata Get" + Utilies.GetEntityName(pp.RelatedTableName) + "()");
                                sw.WriteLine("{");
                                sw.WriteLine("    Type relatedType = Type.GetType(\"" + namespaceName + "." + Utilies.GetEntityName(pp.RelatedTableName) + "\");");
                                sw.WriteLine("    TableMetadata[] result = this.GetRelatedTableData(relatedType);");
                                sw.WriteLine("    return result.Length > 0 ? result[0] : null; ");
                                sw.WriteLine("}");
                            }
                            else if (pp.RelationCardinality == RelationCardinality.OneToMany)
                            {
                                sw.WriteLine("public Array Get" + Utilies.GetEntityName(pp.RelatedTableName) + "()");
                                sw.WriteLine("{");
                                sw.WriteLine("    Type relatedType = Type.GetType(\"" + namespaceName + "." + Utilies.GetEntityName(pp.RelatedTableName) + "\");");
                                sw.WriteLine("    return this.GetRelatedTableData(relatedType);");
                                sw.WriteLine("}");
                            }
                        }
                        else if (relations[j] is ChildTableRelation)
                        {
                            ChildTableRelation pp = (ChildTableRelation)relations[j];
                            sw.WriteLine("public TableMetadata Get" + Utilies.GetEntityName(pp.RelatedTableName) + "()");
                            sw.WriteLine("{");
                            sw.WriteLine("    Type relatedType = Type.GetType(\"" + namespaceName + "." + Utilies.GetEntityName(pp.RelatedTableName) + "\");");
                            sw.WriteLine("    TableMetadata[] result = this.GetRelatedTableData(relatedType);");
                            sw.WriteLine("    return result.Length > 0 ? result[0] : null; ");
                            sw.WriteLine("}");
                        }
                        else
                        {
                            ManyToManyTableRelation pp = (ManyToManyTableRelation)relations[j];
                            sw.WriteLine("public Array Get" + Utilies.GetEntityName(pp.RelatedTableName) + "()");
                            sw.WriteLine("{");
                            sw.WriteLine("    Type relatedType = Type.GetType(\"" + namespaceName + "." + Utilies.GetEntityName(pp.RelatedTableName) + "\");");
                            sw.WriteLine("    Type intermediaryType = Type.GetType(\"" + namespaceName + "." + Utilies.GetEntityName(pp.IntermediaryTableName) + "\");");
                            sw.WriteLine("    return this.GetRelatedTableData(relatedType, intermediaryType);");
                            sw.WriteLine("}");
                        }
                    }

                    #endregion

                    sw.WriteLine("}"); //end class brace
                }


                //end namespace brace
                sw.WriteLine("}");

                sw.Flush();
                sw.Close();
            }
            catch
            {
                throw;
            }
            finally
            {
                if (sw != null)
                {
                    sw.Close();
                }
                if (fs != null)
                {
                    fs.Close();
                }
            }
        }
        private void buttonOK_Click(object sender, EventArgs e)
        {
            //do some checks
            try
            {
                switch (comboBoxRelationType.SelectedIndex)
                {
                case 0:

                    if (CheckParentChildRelation())
                    {
                        //create the relation
                        ParentTableRelation relation = new ParentTableRelation();

                        this.relation = relation;

                        relation.CascadeDeleteChildren = checkBoxEnableCascadeDelete.Checked;

                        if (comboBoxParentChildRelationCardinality.SelectedIndex == 0)
                        {
                            relation.RelationCardinality = RelationCardinality.OneToOne;
                        }
                        else
                        {
                            relation.RelationCardinality = RelationCardinality.OneToMany;
                        }

                        relation.RelatedTableName = comboBoxParentChildRelatedTable.SelectedItem.ToString();
                        relation.ForeignKeyName   = comboBoxParentChildFields.SelectedItem.ToString();


                        DialogResult = DialogResult.OK;

                        this.relation = (TableRelation)relation;

                        Close();
                    }
                    break;


                case 1:
                    if (CheckChildParentRelation())
                    {
                        ChildTableRelation relation = new ChildTableRelation();

                        relation.RelationCardinality = RelationCardinality.OneToOne;


                        relation.RelatedTableName = comboBoxChildParentRelatedTable.SelectedItem.ToString();

                        relation.RelatedTableKeyName = comboBoxChildParentPrimaryKeyFields.SelectedItem.ToString();
                        relation.ForeignKeyName      = comboBoxChildParentForeignKeyFields.SelectedItem.ToString();


                        DialogResult = DialogResult.OK;

                        this.relation = (TableRelation)relation;
                        Close();
                    }
                    break;


                case 2:
                    if (CheckManyToManyRelation())
                    {
                        ManyToManyTableRelation relation = new ManyToManyTableRelation();

                        relation.RelationCardinality = RelationCardinality.ManyToMany;

                        relation.RelatedTableName = comboBoxManyToManyRelatedTable.SelectedItem.ToString();

                        relation.IntermediaryTableName = comboBoxManyToManyIntermediaryTable.SelectedItem.ToString();

                        relation.IntermediaryKeyFieldFromChildTable  = comboBoxManyToManyIntermediaryForeignKeyRelatedEntity.SelectedItem.ToString();
                        relation.IntermediaryKeyFieldFromParentTable = comboBoxManyToManyIntermediaryForeignKeyOurEntity.SelectedItem.ToString();

                        this.relation = (TableRelation)relation;

                        DialogResult = DialogResult.OK;
                        Close();
                    }
                    break;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error \n" + ex.Message, "DataBlock Modeler", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Example #3
0
        /// <summary>
        /// </summary>
        /// <param name="tableNames">String array with table names</param>
        /// <param name="alColumns">ArrayList with columns for each table name</param>
        /// <param name="alTableRelations"></param>
        /// <param name="fileName">The file path</param>
        /// <param name="namespaceName">Namespace name</param>
        public void GenerateTableMetadatata(string[] entityNames, string[] tableNames, ArrayList alColumns, ArrayList alTableRelations, string fileName, string namespaceName)
        {
            if (entityNames.Length != alColumns.Count)
            {
                throw new ArgumentException();
            }

            if (!fileName.EndsWith(".vb"))
            {
                fileName = fileName + ".vb";
            }


            FileStream   fs = null;
            StreamWriter sw = null;

            try
            {
                if (File.Exists(fileName))
                {
                    fs = new FileStream(fileName, FileMode.Truncate, FileAccess.Write);
                }
                else
                {
                    fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);
                }

                sw = new StreamWriter(fs);

                //write header;
                sw.WriteLine("Imports System");
                sw.WriteLine("Imports System.Data");
                sw.WriteLine("Imports voidsoft.DataBlock");


                sw.WriteLine("");
                sw.WriteLine("Namespace " + namespaceName);
                sw.WriteLine(" ");

                for (int i = 0; i < entityNames.Length; i++)
                {
                    entityNames[i] = entityNames[i].Trim();

                    DatabaseColumn[] column = (DatabaseColumn[])alColumns[i];

                    sw.WriteLine("");
                    sw.WriteLine("  <Serializable()> Public Class " + entityNames[i]);
                    sw.WriteLine("		             Inherits TableMetadata");

                    #region add enum field

                    sw.WriteLine("       Public Enum " + entityNames[i] + "Fields");

                    for (int k = 0; k < column.Length; k++)
                    {
                        sw.WriteLine("      " + column[k].Name + " = " + (k + 1).ToString());
                    }

                    sw.WriteLine("       End enum");

                    #endregion

                    sw.WriteLine("			Private _fields() as DatabaseField");
                    sw.WriteLine("");

                    #region generate ctor

                    sw.WriteLine("			Sub New() ");
                    sw.WriteLine("			");
                    sw.WriteLine("					_fields = new DatabaseField("+ (column.Length - 1) + ") {}");

                    string isPrimaryKey;
                    string isAutoIncremented;

                    //generate ctor
                    for (int x = 0; x < column.Length; x++)
                    {
                        string dataType = column[x].columnDataType; // ds.Tables[i].Columns[x].DataType.ToString().Substring(ds.Tables[i].Columns[x].DataType.ToString().IndexOf(".") + 1);

                        if (dataType.Trim() == "System.Byte[]")
                        {
                            dataType = "System.Binary";
                        }

                        isPrimaryKey      = column[x].isPrimaryKey.ToString();
                        isAutoIncremented = column[x].isAutoIncremented.ToString();


                        sw.WriteLine(" _fields(" + x + ") = new DatabaseField(DbType." + dataType.Substring(dataType.IndexOf(".") + 1) + ",\"" + column[x].Name + "\"," + isPrimaryKey + "," + isAutoIncremented + "," + "Nothing)");
                    }

                    sw.WriteLine(" ");
                    sw.WriteLine("me.currentTableName = \"" + tableNames[i] + "\"");
                    sw.WriteLine("");

                    TableRelation[] relations = (TableRelation[])alTableRelations[i];

                    #region generate relations

                    for (int j = 0; j < relations.Length; j++)
                    {
                        //check the realtion type

                        if (relations[j] is ParentTableRelation)
                        {
                            ParentTableRelation pp = (ParentTableRelation)relations[j];

                            sw.WriteLine("Me.listRelations.Add(new ParentTableRelation(\"" + pp.RelatedTableName + "\", \"" + pp.ForeignKeyName + "\"," + "TableRelationCardinality." + pp.RelationCardinality.ToString() + "," + pp.CascadeDeleteChildren.ToString() + "))");
                        }
                        else if (relations[j] is ChildTableRelation)
                        {
                            ChildTableRelation ch = (ChildTableRelation)relations[j];
                            sw.WriteLine("Me.listRelations.Add(new ChildTableRelation(\"" + ch.RelatedTableName + "\",TableRelationCardinality.OneToOne,\"" + ch.RelatedTableKeyName + "\",\"" + ch.ForeignKeyName + "\"))");
                        }
                        else
                        {
                            //many to many
                            ManyToManyTableRelation mm = (ManyToManyTableRelation)relations[j];
                            sw.WriteLine("Me.listRelations.Add(new ManyToManyTableRelation(\"" + mm.RelatedTableName + "\",\"" + mm.IntermediaryTableName + "\",\"" + mm.IntermediaryKeyFieldFromParentTable + "\",\"" + mm.IntermediaryKeyFieldFromChildTable + "\"))");
                        }
                    }

                    #endregion

                    sw.WriteLine("");
                    sw.WriteLine("End Sub");

                    #endregion

                    //generate TableName and DatabaseFields

                    sw.WriteLine("");
                    sw.WriteLine("");
                    sw.WriteLine("");

                    sw.WriteLine("			Public Overrides Property TableFields() as DatabaseField() ");
                    sw.WriteLine("		   	   Get");
                    sw.WriteLine("				  Return _fields");
                    sw.WriteLine("			   End Get");
                    sw.WriteLine("			   Set (ByVal Value as DatabaseField())");
                    sw.WriteLine("			      _fields = value");
                    sw.WriteLine("			   End Set");
                    sw.WriteLine("			End Property");

                    #region generate Clone

                    sw.WriteLine("         Public Function Clone() As " + entityNames[i]);
                    sw.WriteLine("                  Return Me.Clone(Of " + entityNames[i] + ")");
                    sw.WriteLine("         End Function");

                    #endregion

                    #region generate properties

                    for (int x = 0; x < column.Length; x++)
                    {
                        if (column[x].columnDataType == "System.Byte[]")
                        {
                            string dataType = "System.Byte()";

                            sw.WriteLine("");
                            sw.WriteLine("     Public Property " + column[x].Name + "() As " + dataType);
                            sw.WriteLine("        Get");
                            sw.WriteLine("           Dim result As Object = Me.GetField(\"" + column[x].Name + "\").fieldValue");
                            sw.WriteLine("           If result = Nothing Then");
                            sw.WriteLine("               Dim data(0) As Byte");
                            sw.WriteLine("               Return data");
                            sw.WriteLine("           End If");
                            sw.WriteLine("           Return  CType((Me.GetField(\"" + column[x].Name + "\")).fieldValue," + dataType + ")");
                            sw.WriteLine("        End Get ");

                            dataType = "System.Byte";

                            sw.WriteLine("        Set(ByVal Value() As " + dataType + ")");
                            sw.WriteLine("          Me.SetFieldValue(\"" + column[x].Name + "\", Value)");
                            sw.WriteLine("        End Set");
                            sw.WriteLine("      End Property");
                        }
                        else if (column[x].columnDataType == "System.String")
                        {
                            sw.WriteLine("");
                            sw.WriteLine("     Public Property " + column[x].Name + " As " + column[x].columnDataType);
                            sw.WriteLine("        Get");
                            sw.WriteLine("           Return  CType((Me.GetField(\"" + column[x].Name + "\")).fieldValue," + column[x].columnDataType + ")");
                            sw.WriteLine("        End Get ");
                            sw.WriteLine("        Set(ByVal Value As " + column[x].columnDataType + ")");
                            sw.WriteLine("          Me.SetFieldValue(\"" + column[x].Name + "\", Value)");
                            sw.WriteLine("        End Set");
                            sw.WriteLine("      End Property");
                        }
                        else
                        {
                            //nullable types

                            sw.WriteLine("");
                            sw.WriteLine("     Public Property " + column[x].Name + " As Nullable(Of " + column[x].columnDataType + ")");
                            sw.WriteLine("        Get");
                            sw.WriteLine("           Return  CType((Me.GetField(\"" + column[x].Name + "\")).fieldValue," + "Nullable(Of " + column[x].columnDataType + "))");
                            sw.WriteLine("        End Get ");
                            sw.WriteLine("        Set(ByVal Value As Nullable(Of " + column[x].columnDataType + "))");
                            sw.WriteLine("          Me.SetFieldValue(\"" + column[x].Name + "\", Value)");
                            sw.WriteLine("        End Set");
                            sw.WriteLine("      End Property");
                        }
                    }

                    #endregion

                    #region generate "Get" methods implementation;

                    for (int j = 0; j < relations.Length; j++)
                    {
                        //check the realtion type

                        if (relations[j] is ParentTableRelation)
                        {
                            ParentTableRelation pp = (ParentTableRelation)relations[j];

                            if (pp.RelationCardinality == RelationCardinality.OneToOne)
                            {
                                sw.WriteLine("public Function Get" + pp.RelatedTableName + "() As TableMetadata");
                                sw.WriteLine("    Dim relatedType As Type = Type.GetType(\"" + namespaceName + "." + pp.RelatedTableName + "\")");
                                sw.WriteLine("    Dim result() As TableMetadata() = Me.GetRelatedTableData(relatedType)");
                                sw.WriteLine("   If result.Length > 0 Then");
                                sw.WriteLine("      Return result(0);");
                                sw.WriteLine("   Else");
                                sw.WriteLine("      Return Nothing");
                                sw.WriteLine("   End If");
                                sw.WriteLine("End Function");
                            }
                            else if (pp.RelationCardinality == RelationCardinality.OneToMany)
                            {
                                sw.WriteLine("Public Function Get" + pp.RelatedTableName + "() As Array");
                                sw.WriteLine("    Dim relatedType As Type = Type.GetType(\"" + namespaceName + "." + pp.RelatedTableName + "\")");
                                sw.WriteLine("    Return Me.GetRelatedTableData(relatedType)");
                                sw.WriteLine("End Function");
                            }
                        }
                        else if (relations[j] is ChildTableRelation)
                        {
                            ChildTableRelation pp = (ChildTableRelation)relations[j];
                            sw.WriteLine("Public Function Get" + pp.RelatedTableName + "() As TableMetadata");
                            sw.WriteLine("    Dim relatedType As Type = Type.GetType(\"" + namespaceName + "." + pp.RelatedTableName + "\")");
                            sw.WriteLine("    Dim result() As TableMetadata = Me.GetRelatedTableData(relatedType)");
                            sw.WriteLine("   If result.Length > 0 Then");
                            sw.WriteLine("      Return result(0)");
                            sw.WriteLine("   Else");
                            sw.WriteLine("      Return Nothing");
                            sw.WriteLine("   End If");
                            sw.WriteLine("End Function");
                        }
                        else
                        {
                            ManyToManyTableRelation pp = (ManyToManyTableRelation)relations[j];
                            sw.WriteLine("Public Function Get" + pp.RelatedTableName + "() As Array");
                            sw.WriteLine("    Dim relatedType As Type = Type.GetType(\"" + namespaceName + "." + pp.RelatedTableName + "\")");
                            sw.WriteLine("    Dim intermediaryType As Type = Type.GetType(\"" + namespaceName + "." + pp.IntermediaryTableName + "\")");
                            sw.WriteLine("    Return Me.GetRelatedTableData(relatedType, intermediaryType)");
                            sw.WriteLine("End Function");
                        }
                    }

                    #endregion
                }

                //end namespace brace
                sw.WriteLine("End Class");
                sw.WriteLine("End Namespace");

                sw.Flush();
                sw.Close();
                fs.Close();
            }
            catch
            {
                throw;
            }
            finally
            {
                if (sw != null)
                {
                    sw.Close();
                }
                if (fs != null)
                {
                    fs.Close();
                }
            }
        }
        internal static void ParseRelation(string[] parts, ref TableRelation relation, ref string tableName)
        {
            try
            {
                Dictionary <string, string> entries = new Dictionary <string, string>();

                foreach (string part in parts)
                {
                    try
                    {
                        string[] internalPieces = part.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);

                        if (internalPieces.Length != 2)
                        {
                            continue;
                        }

                        entries.Add(internalPieces[0].Trim().ToLower(), internalPieces[1].Trim());
                    }
                    catch
                    {
                        continue;
                    }
                }

                //check the type
                string entry;
                entries.TryGetValue(TYPE, out entry);

                if (string.IsNullOrEmpty(entry))
                {
                    return;
                }

                if (entry == CHILD_PARENT)
                {
                    ChildTableRelation childTableRelation = new ChildTableRelation();
                    childTableRelation.ForeignKeyName      = entries[FOREIGN_KEY_FIELD_NAME];
                    childTableRelation.RelatedTableName    = entries[RELATED_TABLE_NAME];
                    childTableRelation.RelationCardinality = (RelationCardinality)Enum.Parse(typeof(RelationCardinality), entries[CARDINALITY], true);
                    childTableRelation.RelatedTableKeyName = entries[PRIMARY_KEY_FIELD_NAME];

                    tableName = entries[TABLE];

                    relation = childTableRelation;
                }
                else if (entry == PARENT_CHILD)
                {
                    ParentTableRelation parentTableRelation = new ParentTableRelation();
                    parentTableRelation.RelatedTableName    = entries[RELATED_TABLE_NAME];
                    parentTableRelation.ForeignKeyName      = entries[FOREIGN_KEY_FIELD_NAME];
                    parentTableRelation.RelationCardinality = (RelationCardinality)Enum.Parse(typeof(RelationCardinality), entries[CARDINALITY], true);
                    tableName = entries[TABLE];
                    parentTableRelation.CascadeDeleteChildren = Convert.ToBoolean(entries[CASCADE_DELETE_CHILDREN]);

                    relation = parentTableRelation;
                }
                else if (entry == MANY_TO_MANY)
                {
                    ManyToManyTableRelation manyTableRelation = new ManyToManyTableRelation();
                    manyTableRelation.RelatedTableName      = entries[RELATED_TABLE_NAME];
                    manyTableRelation.IntermediaryTableName = entries[INTERMEDIARY_TABLE_NAME];
                    manyTableRelation.IntermediaryKeyFieldFromParentTable = entries[INTERMEDIARY_KEY_FIELD_FROM_PARENT_TABLE];
                    manyTableRelation.IntermediaryKeyFieldFromChildTable  = entries[INTERMEDIARY_KEY_FIELD_FROM_CHILD_TABLE];

                    manyTableRelation.RelationCardinality = RelationCardinality.ManyToMany;

                    tableName = entries[TABLE];

                    relation = manyTableRelation;
                }
            }
            catch
            {
                relation = null;
            }
        }