public void SyncFromDataSourceToTableModel(IHost host) { var myMeta = new dbRoot(); myMeta.Connect(dbDriver.SQL, ConnectionString); try { Engine.MuteNotify(); var tablesTrans = Tables.BeginTransaction(); foreach (ITable metaTable in myMeta.DefaultDatabase.Tables) { var table = tablesTrans.GetNamedChild <TableElement>(metaTable.Name); Tables.AddChild(table); var columnsTrans = table.Columns.BeginTransaction(); foreach (IColumn metaColumn in metaTable.Columns) { var column = columnsTrans.GetNamedChild <ColumnElement>(metaColumn.Name); column.Name = metaColumn.Name; column.IsNullable = metaColumn.IsNullable; column.IsAutoKey = metaColumn.IsAutoKey; column.IsInPrimaryKey = metaColumn.IsInPrimaryKey; column.Default = metaColumn.Default; column.Ordinal = metaColumn.Ordinal; column.DbType = metaColumn.DataTypeName; column.MaxLength = metaColumn.NumericPrecision; column.AutoKeySeed = metaColumn.AutoKeySeed; column.AutoKeyIncrement = metaColumn.AutoKeyIncrement; table.Columns.AddChild(column); } } //update foreign keys //must be done in a 2nd step since all columns are not available in the first loop foreach (ITable metaTable in myMeta.DefaultDatabase.Tables) { var table = tablesTrans.GetNamedChild <TableElement>(metaTable.Name); var foreignKeysTrans = table.ForeignKeys.BeginTransaction(); foreach (IForeignKey metaForeignKey in metaTable.ForeignKeys) { if (metaForeignKey.PrimaryTable.Name == metaTable.Name) { continue; } var foreignKey = foreignKeysTrans.GetNamedChild <ForeignKeyElement>(metaForeignKey.Name); foreignKey.PrimaryTable = tablesTrans.GetNamedChild <TableElement>(metaForeignKey.PrimaryTable.Name); table.ForeignKeys.AddChild(foreignKey); var foreignKeyTrans = foreignKey.BeginTransaction(); for (int i = 0; i < metaForeignKey.ForeignColumns.Count; i++) { var columnPair = new ColumnPairElement(); columnPair.PrimaryColumn = foreignKey.PrimaryTable.Columns.GetNamedChild <ColumnElement>(((IColumn)metaForeignKey.PrimaryColumns[i]).Name); columnPair.ForeignColumn = foreignKey.ForeignTable.Columns.GetNamedChild <ColumnElement>(((IColumn)metaForeignKey.ForeignColumns[i]).Name); foreignKey.AddChild(columnPair); } } } var viewTrans = Views.BeginTransaction(); foreach (IView metaView in myMeta.DefaultDatabase.Views) { var view = viewTrans.GetNamedChild <ViewElement>(metaView.Name); view.Name = metaView.Name; Views.AddChild(view); } var procTrans = Procedures.BeginTransaction(); foreach (IProcedure metaProcedure in myMeta.DefaultDatabase.Procedures) { if (metaProcedure.Type == 3) { continue; } var procedure = procTrans.GetNamedChild <ProcedureElement>(metaProcedure.Name); procedure.Name = metaProcedure.Name; Procedures.AddChild(procedure); } Engine.EnableNotify(); Engine.OnNotifyChange(); } catch { MessageBox.Show("Connection failed"); } host.RefreshProjectTree(); }