//TODO: move to new class
        public List <TableDefinition> listTable()
        {
            List <TableDefinition> result = new List <TableDefinition>();
            //TODO: get all table infomation
            string query = "SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE ='BASE TABLE' order by TABLE_NAME";

            DataTable db = GetDataTalbe(query);

            for (int i = 0; i < db.Rows.Count; i++)
            {
                string tableName = db.Rows[i][0].ToString();
                if (tableName == "sysdiagrams")
                {
                    continue;
                }
                else
                {
                    TableDefinition table = new TableDefinition(tableName).Schema("dbo");

                    DataTable column = getTableColumn(tableName);
                    //get identity field
                    DataTable identites      = GetDataTalbe(string.Format(BaseQuery.GET_TABLE_IDENTITY, tableName));
                    string    identity_Field = "null";
                    if (identites.Rows.Count > 0)
                    {
                        identity_Field = identites.Rows[0][0].ToString();
                    }

                    for (int j = 0; j < column.Rows.Count; j++)
                    {
                        string fieldName      = column.Rows[j][1].ToString();
                        string fieldData      = column.Rows[j][2].ToString();
                        string CONTRAINT_TYPE = column.Rows[j][3].ToString();
                        string RF_TABLE       = column.Rows[j][4].ToString();
                        string RF_COLUMN      = column.Rows[j][5].ToString();

                        if (CONTRAINT_TYPE.Contains("PRIMARY KEY"))
                        {
                            int lastIndex = table.fields.FindIndex(x => x.columnName == fieldName);
                            if (lastIndex < 0)
                            {
                                //check if is identity
                                if (fieldName.Equals(identity_Field))
                                {
                                    table.Field(fieldName).MapTo(MSSQLDataType.MsqlToCSharp(fieldData)).Key().ReadOnly().Auto().Add();
                                }
                                else
                                {
                                    table.Field(fieldName).MapTo(MSSQLDataType.MsqlToCSharp(fieldData)).Key().ReadOnly().Add();
                                }
                            }
                            else
                            {
                                //check if is identity
                                if (fieldName.Equals(identity_Field))
                                {
                                    table.fields[lastIndex].flags = FieldFlags.Key | FieldFlags.ForeignKey | FieldFlags.Auto;
                                }
                                else
                                {
                                    table.fields[lastIndex].flags = FieldFlags.Key | FieldFlags.ForeignKey;
                                }
                            }
                        }
                        else if (CONTRAINT_TYPE.Contains("FOREIGN KEY"))
                        {
                            //check if this is primary key
                            //check if contains key and foreikey
                            //update field
                            int lastIndex = table.fields.FindIndex(x => x.columnName == fieldName);
                            if (lastIndex < 0)
                            {
                                table.Field(fieldName).MapTo(MSSQLDataType.MsqlToCSharp(fieldData))
                                .ForeignKey()
                                .ReferenceTo(RF_TABLE, RF_COLUMN).Add();
                            }
                            else
                            {
                                if (fieldName.Equals(identity_Field))
                                {
                                    table.fields[lastIndex].flags = FieldFlags.Key | FieldFlags.ForeignKey | FieldFlags.Auto;
                                }
                                else
                                {
                                    table.fields[lastIndex].flags = FieldFlags.Key | FieldFlags.ForeignKey;
                                }

                                table.fields[lastIndex].fieldReference = new FieldReference
                                {
                                    table  = RF_TABLE,
                                    column = RF_COLUMN
                                };
                            }
                        }
                        else
                        {
                            table.Field(fieldName).MapTo(MSSQLDataType.MsqlToCSharp(fieldData)).Add();
                        }
                    }
                    result.Add(table);
                }
            }
            return(result);
        }
 public FieldDefinition(TableDefinition table, string name)
 {
     this.table = table;
     columnName = name;
 }