private static void UpdateTables( nHydrate.Generator.Models.Database newDatabase, nHydrate.Generator.Models.Database oldDatabase, List<string> selectedTables, ImportModelSettings settings) { #region Add new tables foreach (Table t in newDatabase.Tables) { if (!oldDatabase.Tables.Contains(t.Name) && selectedTables.Contains(t.Name.ToLower())) { var newT = oldDatabase.Tables.Add(t.Name); var doc = new XmlDocument(); var tableId = newT.Id; doc.LoadXml("<a></a>"); t.XmlAppend(doc.DocumentElement); newT.XmlLoad(doc.DocumentElement); newT.ResetId(tableId); newT.Columns.Clear(); foreach (Reference r in t.Columns) { var newCol = oldDatabase.Columns.Add(((Column)r.Object).Name); var colId = newCol.Id; var doc3 = new XmlDocument(); doc3.LoadXml("<a></a>"); ((Column)r.Object).XmlAppend(doc3.DocumentElement); newCol.XmlLoad(doc3.DocumentElement); newCol.ResetId(colId); newCol.ParentTableRef = newT.CreateRef(); var newRef = new Reference(newT.Root); newRef.Ref = newCol.Id; newRef.RefType = ReferenceType.Column; newT.Columns.Add(newRef); } newT.Relationships.Clear(); } } #endregion #region Update existing tables foreach (var t in oldDatabase.Tables.OrderBy(x => x.Name)) { if (selectedTables.Contains(t.Name.ToLower())) { var newT = newDatabase.Tables[t.Name]; if (newT != null) { #region Update matching columns var delRefList = new List<Reference>(); foreach (Reference r in t.Columns) { var oldCol = (Column)r.Object; var newColRef = newT.Columns.FindByName(oldCol.Name); Column newCol = null; if (newColRef != null) newCol = (Column)newColRef.Object; var doUpdate = ((newCol != null) && (oldCol.CorePropertiesHash != newCol.CorePropertiesHash)); if (doUpdate && settings.OverridePrimaryKey) doUpdate = (oldCol.CorePropertiesHashNoPK != newCol.CorePropertiesHashNoPK); if (doUpdate) { oldCol.CancelUIEvents = true; var colId = oldCol.Id; var colKey = oldCol.Key; var isPrimaryKey = oldCol.PrimaryKey; newCol.CodeFacade = oldCol.CodeFacade; //newCol.ResetId(colId); //newCol.SetKey(colKey); var doc = new XmlDocument(); doc.LoadXml("<a></a>"); newCol.XmlAppend(doc.DocumentElement); oldCol.XmlLoad(doc.DocumentElement); oldCol.ResetId(colId); oldCol.SetKey(colKey); //oldCol.PrimaryKey = isPrimaryKey; oldCol.ParentTableRef = newDatabase.Tables[(newCol.ParentTableRef.Object as Table).Name].CreateRef(); oldCol.CancelUIEvents = false; } else if (newCol == null) { delRefList.Add(r); } } //Remove deleted fields foreach (var r in delRefList) { t.Columns.Remove(r); } #endregion #region Add new columns foreach (var c in newT.GetColumns()) { if (t.GetColumns().FirstOrDefault(x => x.Name == c.Name) == null) { var newCol = oldDatabase.Columns.Add(c.Name); var colId = newCol.Id; var doc = new XmlDocument(); doc.LoadXml("<a></a>"); c.XmlAppend(doc.DocumentElement); newCol.XmlLoad(doc.DocumentElement); newCol.ResetId(colId); newCol.ParentTableRef = t.CreateRef(); var newRef = new Reference(t.Root); newRef.Ref = newCol.Id; newRef.RefType = ReferenceType.Column; t.Columns.Add(newRef); } } #endregion #region Delete old columns var delColumnList = new List<Column>(); foreach (Reference r in t.Columns) { if (newT.GetColumns().FirstOrDefault(x => x.Name == ((Column)r.Object).Name) == null) { delColumnList.Add((Column)r.Object); } } foreach (var c in delColumnList) { oldDatabase.Columns.Remove(c); } #endregion #region Update table properties t.CancelUIEvents = true; t.Description = newT.Description; t.AssociativeTable = newT.AssociativeTable; t.Generated = newT.Generated; t.HasHistory = newT.HasHistory; //t.AllowModifiedAudit = newT.AllowModifiedAudit; //t.AllowCreateAudit = newT.AllowCreateAudit; //t.AllowTimestamp = newT.AllowTimestamp; t.TypedTable = newT.TypedTable; t.CreateMetaData = newT.CreateMetaData; t.FullIndexSearch = newT.FullIndexSearch; t.IsMetaData = newT.IsMetaData; t.IsMetaDataDefinition = newT.IsMetaDataDefinition; t.IsMetaDataMaster = newT.IsMetaDataMaster; t.DBSchema = newT.DBSchema; t.CancelUIEvents = false; #endregion } } } #endregion #region Delete removed tables var delTableList = new List<Table>(); foreach (Table t in oldDatabase.Tables) { if (selectedTables.Contains(t.Name.ToLower())) { if (!newDatabase.Tables.Contains(t.Name)) delTableList.Add(t); } } foreach (var t in delTableList) { oldDatabase.Tables.Remove(t); } #endregion #region DEBUG foreach (var t in oldDatabase.Tables.OrderBy(x => x.Name)) { #region Columns foreach (var c in t.GetColumns()) { if (c.ParentTableRef == null) { System.Diagnostics.Debug.Write(""); } else if (c.ParentTableRef.Object == null) { System.Diagnostics.Debug.Write(""); } } #endregion #region Relations foreach (Relation r in t.GetRelations()) { if (r.ChildTableRef == null) { System.Diagnostics.Debug.Write(""); } else if (r.ChildTableRef.Object == null) { System.Diagnostics.Debug.Write(""); } if (r.ParentTableRef == null) { System.Diagnostics.Debug.Write(""); } else if (r.ParentTableRef.Object == null) { System.Diagnostics.Debug.Write(""); } } #endregion } #endregion }
private static void UpdateViews( nHydrate.Generator.Models.Database newDatabase, nHydrate.Generator.Models.Database oldDatabase, List<string> selectedViews, ImportModelSettings settings) { #region Update existing items foreach (CustomView t in oldDatabase.CustomViews) { if (selectedViews.Contains(t.Name.ToLower())) { var newV = newDatabase.CustomViews[t.Name]; if (newV != null) { #region Update matching columns var delRefList = new List<Reference>(); foreach (Reference r in t.Columns) { var oldCol = (CustomViewColumn)r.Object; var newColRef = newV.Columns.FindByName(oldCol.Name); CustomViewColumn newCol = null; if (newColRef != null) newCol = (CustomViewColumn)newColRef.Object; var doUpdate = ((newCol != null) && (oldCol.CorePropertiesHash != newCol.CorePropertiesHash)); if (doUpdate && settings.OverridePrimaryKey) doUpdate = (oldCol.CorePropertiesHashNoPK != newCol.CorePropertiesHashNoPK); if (doUpdate) { oldCol.CancelUIEvents = true; var colId = oldCol.Id; var colKey = oldCol.Key; newCol.CodeFacade = oldCol.CodeFacade; //newCol.ResetId(colId); //newCol.SetKey(colKey); var doc = new XmlDocument(); doc.LoadXml("<a></a>"); newCol.XmlAppend(doc.DocumentElement); oldCol.XmlLoad(doc.DocumentElement); oldCol.ResetId(colId); oldCol.SetKey(colKey); oldCol.CancelUIEvents = false; } else if (newCol == null) { delRefList.Add(r); } } //Remove deleted fields foreach (var r in delRefList) { t.Columns.Remove(r); } #endregion #region Add new columns foreach (Reference r in newV.Columns) { var c = (CustomViewColumn)r.Object; if (t.GetColumns().FirstOrDefault(x => x.Name == c.Name) == null) { var newCol = oldDatabase.CustomViewColumns.Add(c.Name); var colId = newCol.Id; var doc = new XmlDocument(); doc.LoadXml("<a></a>"); c.XmlAppend(doc.DocumentElement); newCol.XmlLoad(doc.DocumentElement); newCol.ResetId(colId); newCol.ParentViewRef = t.CreateRef(); var newRef = new Reference(t.Root); newRef.Ref = newCol.Id; newRef.RefType = ReferenceType.CustomViewColumn; t.Columns.Add(newRef); } } #endregion #region Delete old columns var delColumnList = new List<CustomViewColumn>(); foreach (Reference r in t.Columns) { if (newV.GetColumns().FirstOrDefault(x => x.Name == ((CustomViewColumn)r.Object).Name) == null) { delColumnList.Add((CustomViewColumn)r.Object); } } foreach (var c in delColumnList) { oldDatabase.CustomViewColumns.Remove(c); } #endregion #region Update item properties t.CancelUIEvents = true; t.Description = newV.Description; t.Generated = newV.Generated; t.SQL = newV.SQL; t.CancelUIEvents = false; #endregion } } } #endregion #region Add new items foreach (CustomView t in newDatabase.CustomViews) { if (selectedViews.Contains(t.Name.ToLower())) { if (!oldDatabase.CustomViews.Contains(t.Name)) { var newV = oldDatabase.CustomViews.Add(t.Name); var doc = new XmlDocument(); var tableId = newV.Id; doc.LoadXml("<a></a>"); t.XmlAppend(doc.DocumentElement); newV.XmlLoad(doc.DocumentElement); newV.ResetId(tableId); newV.Columns.Clear(); foreach (Reference r in t.Columns) { var newCol = oldDatabase.CustomViewColumns.Add(((CustomViewColumn)r.Object).Name); var colId = newCol.Id; var doc3 = new XmlDocument(); doc3.LoadXml("<a></a>"); ((CustomViewColumn)r.Object).XmlAppend(doc3.DocumentElement); newCol.XmlLoad(doc3.DocumentElement); newCol.ResetId(colId); newCol.ParentViewRef = newV.CreateRef(); var newRef = new Reference(newV.Root); newRef.Ref = newCol.Id; newRef.RefType = ReferenceType.CustomViewColumn; newV.Columns.Add(newRef); } } } } #endregion #region Delete removed items var delViewList = new List<CustomView>(); foreach (CustomView t in oldDatabase.CustomViews) { if (selectedViews.Contains(t.Name.ToLower())) { if (!newDatabase.CustomViews.Contains(t.Name)) delViewList.Add(t); } } foreach (var t in delViewList) { oldDatabase.CustomViews.Remove(t); } #endregion }
/// <summary> /// Show a windows to refresh teh model from a database /// </summary> public static ImportReturnConstants ImportModel(ModelRoot currentGraph, ModelRoot newGraph, ImportModelSettings settings, List<string> selectedTables, List<string> selectedViews) { var processKey = string.Empty; try { //var newProject = new nHydrateGeneratorProject(); //newProject.FileName = currentGraph.FileName; //var newRoot = newProject.RootController.Object as ModelRoot; var oldRoot = currentGraph; //newRoot.TransformNames = oldRoot.TransformNames; //newRoot.Database.CreatedByColumnName = oldRoot.Database.CreatedByColumnName; //newRoot.Database.CreatedDateColumnName = oldRoot.Database.CreatedDateColumnName; //newRoot.Database.ModifiedByColumnName = oldRoot.Database.ModifiedByColumnName; //newRoot.Database.ModifiedDateColumnName = oldRoot.Database.ModifiedDateColumnName; //newRoot.Database.TimestampColumnName = oldRoot.Database.TimestampColumnName; //if (!GetProjectFromSqlSchema(newProject)) //{ // return ImportReturnConstants.Aborted; //} var newDatabase = newGraph.Database; var oldDatabase = currentGraph.Database; ////Check if there are any changes and if so show the form //if (F.GetChangeCount() == 0) //{ // return ImportReturnConstants.NoChange; //} //else if (F.ShowDialog() != System.Windows.Forms.DialogResult.OK) //{ // return ImportReturnConstants.Aborted; //} //var settings = F.Settings; //var connectionString = F.GetConnectionString(); //processKey = UIHelper.ProgressingStarted(); try { UpdateTables(newDatabase, oldDatabase, selectedTables, settings); #region Relations var oldList = new List<Relation>(); foreach (Relation r in oldDatabase.Relations) oldList.Add(r); oldDatabase.Relations.Clear(); UpdateRelations(newDatabase, oldDatabase); //Now reset the role names where necessary foreach (Relation r1 in oldDatabase.Relations) { foreach (var r2 in oldList) { if (r1.Equals(r2) && (r1.RoleName != r2.RoleName)) r1.RoleName = r2.RoleName; } } #endregion UpdateViews(newDatabase, oldDatabase, selectedViews, settings); //this.UpdateStoredProcedures(newDatabase, oldDatabase, settings); //Refresh the tree //currentGraph.RootController.Node.RefreshDeep(); //((ModelRootController)currentGraph.Controller).ClearTree(); } catch (Exception ex) { throw; } finally { //UIHelper.ProgressingComplete(processKey); } return ImportReturnConstants.Success; } catch (SqlException ex) { MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Information); return ImportReturnConstants.Aborted; } catch (Exception ex) { throw; } finally { //UIHelper.ProgressingComplete(processKey); } }