internal void tableMappingSwitchDatabase(TableMapping[] tableMappings, Database db)
        {
            Dictionary<int, TableMapping> newTableMappings = new Dictionary<int, TableMapping>();

            foreach (TableMapping tableMapping in tableMappings)
            {
                DBTable table = db.Tables.Where(t => t.Reference == tableMapping.DestinationTable.Reference).FirstOrDefault();
                if (table != null)
                {
                    TableMapping newTableMapping = new TableMapping(table, tableMapping.ImportType, new ColumnMapping[0]);
                    newTableMappings.Add(tableMapping.Index, newTableMapping);
                }
            }

            foreach (int index in newTableMappings.Keys)
            {
                TableMapping newTableMapping = newTableMappings[index];

                List<ColumnMapping> newColumnMappings = new List<ColumnMapping>();

                TableMapping oldTableMapping = tableMappings
                    .Where(t => t.Index == index).First();

                ColumnMapping[] oldColumnMappings = oldTableMapping.ColumnMappings;

                foreach (ColumnMapping oldColumnMapping in oldColumnMappings)
                {
                    DBColumn column = newTableMapping.DestinationTable.Columns
                        .Where(c => c.Name == oldColumnMapping.DestinationColumn.Name)
                        .FirstOrDefault();

                    if (column != null)
                    {
                        string type = oldColumnMapping.GetType().ToString();
                        ColumnMapping newColumnMapping = null;

                        if (type == typeof(ExcelColumnMapping).ToString())
                        {
                            var excelColumnMapping = (ExcelColumnMapping)oldColumnMapping;
                            newColumnMapping = new ExcelColumnMapping(excelColumnMapping.SourceHeader, column, oldColumnMapping.ColumnUse);
                        }
                        else if (type == typeof(TableColumnMapping).ToString())
                        {
                            var tableColumnMapping = (TableColumnMapping)oldColumnMapping;

                            if (newTableMappings.ContainsKey(tableColumnMapping.SourceTableMapping.Index))
                            {
                                TableMapping newSourceTableMapping = newTableMappings[tableColumnMapping.SourceTableMapping.Index];
                                DBColumn newSourceColumn = newSourceTableMapping.DestinationTable.Columns
                                    .Where(c => c.Name == tableColumnMapping.SourceColumn.Name)
                                    .FirstOrDefault();

                                if (newSourceColumn != null)
                                {
                                    newColumnMapping = new TableColumnMapping(newSourceTableMapping, newSourceColumn, column, oldColumnMapping.ColumnUse);
                                }
                            }
                        }
                        else if (type == typeof(LiteralColumnMapping).ToString())
                        {
                            var literalColumnMapping = (LiteralColumnMapping)oldColumnMapping;
                            newColumnMapping = new LiteralColumnMapping(literalColumnMapping.Literal, literalColumnMapping.LiteralType, column, literalColumnMapping.ColumnUse);
                        }

                        if (newColumnMapping == null)
                        {
                            newColumnMapping = new NullColumnMapping(column, oldColumnMapping.ColumnUse);
                        }

                        newColumnMappings.Add(newColumnMapping);
                    }
                }

                newTableMapping.ColumnMappings = newColumnMappings.ToArray();
            }

            this.TableMappings = newTableMappings.Values.ToList();
        }