Exemplo n.º 1
0
        public void SetConnection(MenuItem item, bool raiseConnectionChangeEvent)
        {
            if (item.Tag == null || item.Tag.ToString() == Connections.Instance.DefaultConnectionName)
            {
                Connections.Instance.DatabaseModel = Connections.Instance.DefaultDatabaseModel;

                EventParser.ParseMessage(Connections.Instance.DatabaseModel, "DatabaseConnection", Connections.Instance.DefaultConnectionName);

                this.IsDefaultConnection = true;

                if (raiseConnectionChangeEvent)
                {
                    Connections.Instance.ConnectionChanged?.Invoke(Connections.Instance, Connections.Instance.DatabaseModel);
                }

                return;
            }

            Connections.Instance.DatabaseModel = Connections.Instance.AlternativeModels[item.Tag.ToString()];

            EventParser.ParseMessage(Connections.Instance.DatabaseModel, "DatabaseConnection", item.Tag.ToString());

            this.IsDefaultConnection = false;

            if (raiseConnectionChangeEvent)
            {
                Connections.Instance.ConnectionChanged?.Invoke(Connections.Instance, Connections.Instance.DatabaseModel);
            }
        }
        /// <summary>
        /// Loads the tables from the database
        /// </summary>
        /// <param name="databaseModel">the DatabaseModel object to exeute the query against</param>
        /// <returns>returns a List<TableModel> (Columns not loaded)</returns>
        public List <TableModel> GetTables(Dispatcher dispatcher)
        {
            List <TableModel> result = new List <TableModel>();

            DataAccess dataAccess = new DataAccess(Connections.DatabaseModel);

            XDocument tablesXml = dataAccess.ExecuteQuery(SQLQueries.DatabaseQueries.DatabaseTablesQuery(Connections.DatabaseModel.DatabaseName));

            foreach (XElement rowItem in tablesXml.Root.Elements())
            {
                string tableName = rowItem.Element("TABLE_NAME").Value;

                EventParser.ParseMessage(this, dispatcher, "Reading", tableName);

                if (tableName.ToLower() == "sysdiagrams")
                {
                    continue;
                }

                List <dynamic> clusterList = dataAccess.ExecuteQueryDynamic(SQLQueries.DatabaseQueries.DatabasePrimaryClusterName(tableName));

                TableModel model = new TableModel {
                    TableName = tableName
                };

                model.PrimaryKeyClusterConstraintName = clusterList.Count > 0 ? ((IDictionary <string, object>)clusterList[0]).Values.FirstOrDefault().ToString() : tableName;

                result.Add(model);
            }

            return(result);
        }
Exemplo n.º 3
0
        private void BuildModelFiles(ErdCanvasModel[] canvases, Dispatcher dispatcher)
        {
            string basePath = Path.Combine(EntityModelScript.Setup.ClientModelOutputDirectory, "Base");

            string userPath = Path.Combine(EntityModelScript.Setup.ClientModelOutputDirectory, "User");

            Paths.CreateDirectory(basePath);

            Paths.CreateDirectory(userPath);

            foreach (ErdCanvasModel canvas in canvases)
            {
                foreach (TableModel table in canvas.SegmentTables)
                {
                    dispatcher.Invoke(() => { EventParser.ParseMessage(this, new ParseMessageEventArguments {
                            Message = string.Format("Building Model {0}", table.TableName)
                        }); });

                    string modelBase = EntityModelScript.ScriptServerModelBase(table);

                    string className = EntityModelScript.GetClassName(table);

                    File.WriteAllText(Path.Combine(basePath, $"{className}_Base.cs"), modelBase);

                    string userFileName = Path.Combine(userPath, $"{className}.cs");

                    if (!File.Exists(userFileName))
                    {
                        string model = EntityModelScript.ScriptServerModel(table);

                        File.WriteAllText(userFileName, model);
                    }
                }
            }
        }
Exemplo n.º 4
0
        private void RunMappingScriptor(ErdCanvasModel[] canvases, Dispatcher dispatcher)
        {
            try
            {
                string dispatchNote = "Build Mappings Script for: {0}";

                Paths.CreateDirectory(Path.Combine(EntityModelScript.Setup.ServerOutputBaseDirectory, "Mappings"));

                foreach (ErdCanvasModel canvas in canvases)
                {
                    foreach (TableModel table in canvas.SegmentTables)
                    {
                        dispatcher.Invoke(() => { EventParser.ParseMessage(this, new ParseMessageEventArguments {
                                Message = string.Format(dispatchNote, table.TableName)
                            }); });

                        string mapptingPath = Path.Combine(EntityModelScript.Setup.ServerOutputBaseDirectory, "Mappings", $"{EntityModelScript.GetClassName(table)}Mapping.cs");

                        string mappingResult = EntityModelScript.ScriptServerModelMapping(table);

                        File.WriteAllText(mapptingPath, mappingResult);
                    }
                }
            }
            catch (Exception err)
            {
                throw;
            }
        }
        /// <summary>
        /// Loads the tables from the database
        /// </summary>
        /// <param name="databaseModel">the DatabaseModel object to exeute the query against</param>
        /// <returns>returns a List<TableModel> (Columns not loaded)</returns>
        public List <TableModel> GetTables(Dispatcher dispatcher)
        {
            List <TableModel> result = new List <TableModel>();

            DataAccess dataAccess = null;

            dispatcher.Invoke(() =>
            {
                RECONNECT:

                dataAccess = new DataAccess(Connections.Instance.DatabaseModel);

                if (!dataAccess.TestConnection())
                {
                    if (ModelView.ShowDialog("Connection Failure", Connections.Instance.DatabaseModel).IsFalse())
                    {
                        throw new Exception("Connection failure. User opt out.");
                    }

                    goto RECONNECT;
                }
            });


            XDocument tablesXml = dataAccess.ExecuteQuery(SQLQueries.DatabaseQueries.DatabaseTablesQuery(Connections.Instance.DatabaseModel.DatabaseName));

            List <dynamic> clusterList = dataAccess.ExecuteQueryDynamic(SQLQueries.DatabaseQueries.DatabasePrimaryClusterName());

            foreach (XElement rowItem in tablesXml.Root.Elements())
            {
                string tableName   = rowItem.Element("TABLE_NAME").Value;
                string tableSchema = rowItem.Element("TABLE_SCHEMA").Value;

                EventParser.ParseMessage(this, dispatcher, "Reading", tableName);

                if (tableName == "sysdiagrams")
                {
                    continue;
                }

                dynamic selectedCluster = clusterList.FirstOrDefault(d => ((IDictionary <string, object>)d).Values.ToArray()[1].ToString() == tableName);

                TableModel model = new TableModel {
                    TableName = tableName, SchemaName = tableSchema
                };

                model.PrimaryKeyClusterConstraintName = selectedCluster != null ? ((IDictionary <string, object>)clusterList[0]).Values.FirstOrDefault().ToString() : tableName;

                result.Add(model);
            }

            return(result);
        }
        public async void CreateTableObject(TableModel table)
        {
            if (!table.IsNewTable && (table.Columns == null || table.Columns.Count() == 0))
            {
                await Task.Factory.StartNew(() =>
                {
                    ReverseEngineer reverseEngineer = new ReverseEngineer(this.Dispatcher);

                    EventParser.ParseMessage(this, this.Dispatcher, string.Empty, "Reading table information.");

                    table.Columns = table.Columns.AddRange(reverseEngineer.GetTableColumns(table.TableName).ToArray());

                    table.PrimaryKeyClusterConstraintName = reverseEngineer.GetTablePrimaryKeyCluster(table.TableName);
                });
            }

            table.IsNewTable = false;

            table.IsDeleted = false;

            Integrity.MapTable(table);

            TableObject tableControl = new TableObject(table);

            tableControl.TableMove += this.TableObject_Move;

            tableControl.RemoveTable += this.TableObject_Remove;

            tableControl.ForeignKeyColumnAdded += this.TableObject_ForeignKeyAdded;

            foreach (KeyValuePair <string, DatabaseRelation> relation in tableControl.ColumnRelationModel)
            {
                relation.Value.DatabaseRelationDelete += this.DatabaseRelation_Delete;

                this.columnRelationModel.Add(relation.Key, relation.Value);
            }

            this.Children.Add(tableControl);

            this.ResizeCanvas(tableControl.Location, tableControl.ActualHeight, tableControl.ActualWidth);

            if (this.IsLoaded)
            {
                tableControl.InvalidateVisual();

                this.AddRelationsDrawing(tableControl);
            }

            tableControl.TableColumnChanged += this.TableColumn_Changed;

            tableControl.TableHeaderChanged += this.TableHeader_Changed;
        }
        public List <ColumnObjectModel> GetTableColumns(string schema, string tableName)
        {
            EventParser.ParseMessage(this, this.dispatcher, "Reading Table ", tableName);

            List <ColumnObjectModel> result = new List <ColumnObjectModel>();

            DataAccess dataAccess = new DataAccess(Connections.Instance.DatabaseModel);

            XDocument columnsXml = dataAccess.ExecuteQuery(SQLQueries.DatabaseQueries.DatabaseTableColumnsQuery(schema, tableName));

            foreach (XElement item in columnsXml.Root.Elements())
            {
                string columnName = item.Element("COLUMNNAME").Value;

                EventParser.ParseMessage(this, this.dispatcher, "Reading Column ", columnName);

                if (result.Any(col => col.ColumnName == columnName))
                {
                    continue;
                }

                string originalPosistion = Connections.Instance.IsDefaultConnection ? item.Element("ORDINAL_POSITION").Value : string.Empty;

                XDocument primaryKey = dataAccess.ExecuteQuery(SQLQueries.DatabaseQueries.DatabaseColumnKeysQuery(tableName, columnName));

                ColumnObjectModel column = new ColumnObjectModel
                {
                    ColumnName            = columnName,
                    IsIdentity            = item.Element("IS_IDENTITY").Value.ToBool(),
                    AllowNulls            = item.Element("IS_NULLABLE").Value.ToBool(),
                    MaxLength             = item.Element("MAX_LENGTH").Value.ToInt32(),
                    Precision             = item.Element("PRECISION").Value.ToInt32(),
                    Scale                 = item.Element("SCALE").Value.ToInt32(),
                    IsForeignkey          = !item.Element("PRIMARY_TABLE").Value.IsNullEmptyOrWhiteSpace(),
                    ForeignKeyTable       = item.Element("PRIMARY_TABLE").Value,
                    ForeignKeyColumn      = item.Element("PRIMARY_COLUMNNAME").Value,
                    ForeignConstraintName = item.Element("FK_CONSTRAINT_NAME").Value,
                    SqlDataType           = this.ParseSqlDbType(item.Element("DATA_TYPE").Value),
                    InPrimaryKey          = primaryKey.Descendants().Any(d => d.Value == "PRIMARY KEY"),
                    Column_Id             = item.Element("COLUMN_ID").Value.ToInt32(),
                    OriginalPosition      = originalPosistion.IsNullEmptyOrWhiteSpace() ? 0 : originalPosistion.ToInt32()
                };

                column.HasModelChanged = false;

                result.Add(column);
            }

            return(result);
        }
Exemplo n.º 8
0
        public async void CheckLockStatus(List <string> lockedFiles)
        {
            bool isLocked = false;

            bool haveLock = false;

            string lockedByUser = string.Empty;

            string thisName = $"{this.ErdSegment.ModelSegmentControlName}:";

            await Task.Factory.StartNew(() =>
            {
                foreach (string lockedItem in lockedFiles)
                {
                    if (!lockedItem.StartsWith(thisName))
                    {
                        continue;
                    }

                    string[] lockInformation = lockedItem.Split(':');

                    lockedByUser = lockInformation[1];

                    isLocked = Environment.UserName != lockedByUser;

                    if (!isLocked)
                    {
                        lockedByUser = "******";
                    }

                    haveLock = true;
                }
            });

            this.Dispatcher.Invoke(() =>
            {
                this.uxTabLock.Visibility = haveLock ? Visibility.Visible : Visibility.Collapsed;

                this.uxTabLock.Content = $"This Canvas is locked by {lockedByUser}";

                this.uxTableCanvas.IsEnabled = !isLocked;

                if (lockedByUser == "You")
                {
                    EventParser.ParseMessage(this, "SetForwardEngineerOption", string.Empty);
                }
            });
        }
Exemplo n.º 9
0
        private void SetLock()
        {
            EventParser.ParseMessage(this, "SetForwardEngineerOption", string.Empty);

            this.ErdSegment.SetLock(true, false); // Alwasy set this to ensure that the canvas will be saved

            if (!General.ProjectModel.LockCanvasOnEditing)
            {
                return;
            }

            CanvasLocks.Instance.LockFile(this.ErdSegment.ModelSegmentControlName);

            this.uxTabLock.Visibility = Visibility.Visible;

            this.uxTabLock.Content = "This Canvas is locked by You";
        }
Exemplo n.º 10
0
        private void RunContextScriptor(ErdCanvasModel[] canvases, Dispatcher dispatcher)
        {
            try
            {
                if (EntityModelScript.Setup.BuildContextForeachCanvas)
                {
                    string dispatchNote = "Build Data Context File for: {0}";

                    foreach (ErdCanvasModel canvas in canvases)
                    {
                        dispatcher.Invoke(() => { EventParser.ParseMessage(this, new ParseMessageEventArguments {
                                Message = string.Format(dispatchNote, canvas.ModelSegmentName)
                            }); });

                        string fileName = canvas.ModelSegmentName.MakeAlphaNumeric();

                        this.BuildContextFile(fileName, canvas.SegmentTables.OrderBy(n => n.TableName).ToArray(), canvas.IncludeInContextBuild.ToArray());
                    }
                }
                else
                {
                    dispatcher.Invoke(() => { EventParser.ParseMessage(this, new ParseMessageEventArguments {
                            Message = "DataContext"
                        }); });

                    List <TableModel> tablesUsed = new List <TableModel>();

                    foreach (List <TableModel> canvasTables in canvases.Select(t => t.SegmentTables))
                    {
                        tablesUsed.AddRange(canvasTables.ToArray());
                    }

                    this.BuildContextFile("DataContext", tablesUsed.OrderBy(n => n.TableName).ToArray(), new IncludeTableModel[] {});
                }
            }
            catch (Exception err)
            {
                throw;
            }
        }
Exemplo n.º 11
0
        private void BuildRepositoriesFiles(ErdCanvasModel[] canvases, Dispatcher dispatcher)
        {
            string basePath = Path.Combine(EntityModelScript.Setup.ServerOutputBaseDirectory, "Repositories", "Base");

            string userPath = Path.Combine(EntityModelScript.Setup.ServerOutputBaseDirectory, "Repositories", "User");

            Paths.CreateDirectory(basePath);

            Paths.CreateDirectory(userPath);

            dispatcher.Invoke(() => { EventParser.ParseMessage(this, new ParseMessageEventArguments {
                    Message = "Building Reposirories"
                }); });

            if (EntityModelScript.Setup.BuildContextForeachCanvas)
            {
                foreach (ErdCanvasModel canvas in canvases)
                {
                    string fileName = canvas.ModelSegmentName.MakeAlphaNumeric();

                    this.BuildRepositoryBase(fileName, fileName, basePath, canvas.SegmentTables.ToArray(), canvas.IncludeInContextBuild.ToArray());

                    this.BuildRepository(fileName, userPath);
                }
            }
            else
            {
                List <TableModel> tablesUsed = new List <TableModel>();

                foreach (List <TableModel> canvasTables in canvases.Select(t => t.SegmentTables))
                {
                    tablesUsed.AddRange(canvasTables.ToArray());
                }

                this.BuildRepositoryBase("Context", "DataContext", basePath, tablesUsed.ToArray(), new IncludeTableModel[] {});

                this.BuildRepository("Context", userPath);
            }
        }
Exemplo n.º 12
0
        private async void RunScriptBuilderAsync(ErdCanvasModel[] canvases, Dispatcher dispatcher)
        {
            try
            {
                Exception resultError = null;

                await Task.Factory.StartNew(() =>
                {
                    try
                    {
                        this.RunMappingScriptor(canvases, dispatcher);

                        this.RunContextScriptor(canvases, dispatcher);

                        this.BuildRepositoriesFiles(canvases, dispatcher);

                        this.BuildModelFiles(canvases, dispatcher);

                        dispatcher.Invoke(() => { EventParser.ParseMessage(this, new ParseMessageEventArguments {
                                Message = "Build Completed"
                            }); });
                    }
                    catch (Exception err)
                    {
                        resultError = err;
                    }
                });

                if (resultError != null)
                {
                    MessageBox.Show(resultError.InnerExceptionMessage());
                }
            }
            catch
            {
                throw;
            }
        }
        private void CheckTables()
        {
            foreach (TableModel fromDatabase in this.databaseTables)
            {
                EventParser.ParseMessage(this, dispatcher, fromDatabase.TableName, $"Compare Table {fromDatabase.TableName} from Database to ERD");

                if (!this.canvasTables.Any(ct => ct.TableName.ToUpper() == fromDatabase.TableName.ToUpper()))
                {
                    this.result.Add(new CompareResultModel
                    {
                        TableObject  = fromDatabase,
                        ObjectName   = fromDatabase.TableName,
                        Message      = "Table exist in Database but not on ERD Model.",
                        ObjectType   = ObjectTypeEnum.Table,
                        ObjectAction = ObjectActionEnum.DropFromDatabase
                    });
                }
            }

            foreach (TableModel fromCanvas in this.canvasTables)
            {
                EventParser.ParseMessage(this, dispatcher, fromCanvas.TableName, $"Compare Table {fromCanvas.TableName} from ERD to Database");

                if (!this.databaseTables.Any(ct => ct.TableName.ToUpper() == fromCanvas.TableName.ToUpper()))
                {
                    this.result.Add(new CompareResultModel
                    {
                        TableObject  = fromCanvas,
                        ObjectName   = fromCanvas.TableName,
                        Message      = "Table exists on ERD Model but not in Database.",
                        ObjectType   = ObjectTypeEnum.Table,
                        ObjectAction = ObjectActionEnum.CreateInDatabase
                    });
                }
            }
        }
        private void CheckColumns()
        {
            string[] databaseTableNames = this.databaseTables.Select(tn => tn.TableName).ToArray();

            string[] erdTableNames = this.canvasTables.Select(tn => tn.TableName).ToArray();

            Dictionary <string, List <ColumnObjectModel> > fromDatabaseList = this.reverse.GetInTableColumns(databaseTableNames);

            Dictionary <string, List <ColumnObjectModel> > fromErdList = this.reverse.GetInTableColumns(erdTableNames);

            foreach (TableModel fromDatabase in this.databaseTables)
            {
                EventParser.ParseMessage(this, dispatcher, "Getting Columns", fromDatabase.TableName);

                fromDatabase.Columns = fromDatabaseList[fromDatabase.TableName].ToArray();
                //this.reverse.GetTableColumns(fromDatabase.TableName).ToArray();

                TableModel fromCanvas = this.canvasTables.FirstOrDefault(tn => tn.TableName.ToUpper() == fromDatabase.TableName.ToUpper());

                if (fromCanvas == null ||
                    fromCanvas.ErdSegmentModelName.IsNullEmptyOrWhiteSpace())
                {
                    // This was catched in this.CheckTables()
                    continue;
                }

                if (fromCanvas.ErdSegmentModelName.IsNullEmptyOrWhiteSpace())
                {
                    // The table is not on A Canvas, but was read on startup
                    // We need the columns though
                    fromCanvas.Columns = fromErdList[fromDatabase.TableName].ToArray();
                    //this.reverse.GetTableColumns(fromDatabase.TableName).ToArray();
                }

                #region COMPARE DATABASE COLUMNS TO MODEL

                foreach (ColumnObjectModel databaseColumn in fromDatabase.Columns)
                {
                    ColumnObjectModel canvasColummn = fromCanvas.Columns.FirstOrDefault(dc => dc.ColumnName.ToUpper() == databaseColumn.ColumnName.ToUpper());

                    if (canvasColummn == null)
                    {
                        this.result.Add(new CompareResultModel
                        {
                            TableObject  = fromDatabase,
                            ObjectName   = databaseColumn.ColumnName,
                            Message      = "Column Exist in Database but not on ERD Model.",
                            ObjectType   = ObjectTypeEnum.Column,
                            ObjectAction = ObjectActionEnum.DropFromDatabase
                        });
                    }
                    else if (databaseColumn.DataType != canvasColummn.DataType)
                    {
                        this.result.Add(new CompareResultModel
                        {
                            TableObject  = fromCanvas,
                            ObjectName   = canvasColummn.ColumnName,
                            Message      = $"Data Type differs; Database Data Type {databaseColumn.DataType}; ERD Model Data Type{canvasColummn.DataType}.",
                            ObjectType   = ObjectTypeEnum.Column,
                            ObjectAction = ObjectActionEnum.AlterDatabase
                        });
                    }
                }

                #endregion

                #region COMPARE DATABASE COLUMNS TO MODEL

                foreach (ColumnObjectModel canvasColumn in fromCanvas.Columns)
                {
                    ColumnObjectModel databaseColummn = fromDatabase.Columns.FirstOrDefault(dc => dc.ColumnName.ToUpper() == canvasColumn.ColumnName.ToUpper());

                    if (databaseColummn == null)
                    {
                        this.result.Add(new CompareResultModel
                        {
                            TableObject  = fromCanvas,
                            ObjectName   = canvasColumn.ColumnName,
                            Message      = "Column Exist on ERD Model Database but not in Database.",
                            ObjectType   = ObjectTypeEnum.Column,
                            ObjectAction = ObjectActionEnum.CreateInDatabase
                        });
                    }
                }

                #endregion
            }
        }
        private void CheckRelations()
        {
            foreach (TableModel fromDatabase in this.databaseTables.Where(fk => fk.Columns.Any(col => col.IsForeignkey)))
            {
                EventParser.ParseMessage(this, dispatcher, fromDatabase.TableName, $"Compare Table {fromDatabase.TableName} Foreign Constraints");

                Dictionary <string, List <ColumnObjectModel> > databaseForeignkeyStructure = fromDatabase.Columns
                                                                                             .Where(dk => dk.IsForeignkey &&
                                                                                                    !dk.IsVertualRelation)
                                                                                             .GroupBy(dg => dg.ForeignKeyTable.ToUpper())
                                                                                             .ToDictionary(dd => dd.Key, dd => dd.ToList());

                foreach (KeyValuePair <string, List <ColumnObjectModel> > keyPair in databaseForeignkeyStructure)
                {
                    TableModel canvasKeyTable = this.canvasTables
                                                .FirstOrDefault(ck => ck.TableName.ToUpper() == fromDatabase.TableName.ToUpper());

                    if (canvasKeyTable == null)
                    { // This was handled in the Table Comparison
                        continue;
                    }

                    foreach (ColumnObjectModel databaseColumn in keyPair.Value)
                    {
                        ColumnObjectModel canvasColumn = canvasKeyTable.Columns.FirstOrDefault(cc => cc.ColumnName.ToUpper() == databaseColumn.ColumnName.ToUpper());

                        if (canvasColumn == null)
                        { // This was handled in the Column Comparison
                            continue;
                        }

                        if (databaseColumn.ForeignKeyColumn.ToUpper() != canvasColumn.ForeignKeyColumn.ToUpper())
                        {
                            this.result.Add(new CompareResultModel
                            {
                                TableObject  = fromDatabase,
                                ObjectName   = databaseColumn.ForeignConstraintName,
                                Message      = $"Foreign Key Constraint Exist in Database Model but not on ERD Model. ({databaseColumn.ColumnName})",
                                ObjectType   = ObjectTypeEnum.ForeignKeyConstraint,
                                ObjectAction = ObjectActionEnum.DropFromDatabase
                            });
                        }
                    }
                }
            }

            foreach (TableModel fromCanvas in this.canvasTables.Where(fk => fk.Columns.Any(col => col.IsForeignkey && !col.IsVertualRelation)))
            {
                EventParser.ParseMessage(this, dispatcher, fromCanvas.TableName, $"Compare Table {fromCanvas.TableName} Foreign Constraints");

                Dictionary <string, List <ColumnObjectModel> > canvasForeignkeyStructure = fromCanvas.Columns
                                                                                           .Where(dk => dk.IsForeignkey &&
                                                                                                  !dk.IsVertualRelation)
                                                                                           .GroupBy(dg => dg.ForeignKeyTable.ToUpper())
                                                                                           .ToDictionary(dd => dd.Key, dd => dd.ToList());

                foreach (KeyValuePair <string, List <ColumnObjectModel> > keyPair in canvasForeignkeyStructure)
                {
                    TableModel canvasKeyTable = this.databaseTables
                                                .FirstOrDefault(ck => ck.TableName.ToUpper() == fromCanvas.TableName.ToUpper());

                    if (canvasKeyTable == null)
                    { // This was handled in the Table Comparison
                        continue;
                    }

                    foreach (ColumnObjectModel databaseColumn in keyPair.Value)
                    {
                        ColumnObjectModel canvasColumn = canvasKeyTable.Columns.FirstOrDefault(cc => cc.ColumnName.ToUpper() == databaseColumn.ColumnName.ToUpper());

                        if (canvasColumn == null)
                        { // This was handled in the Column Comparison
                            continue;
                        }

                        if (databaseColumn.ForeignKeyColumn.ToUpper() != canvasColumn.ForeignKeyColumn.ToUpper())
                        {
                            this.result.Add(new CompareResultModel
                            {
                                TableObject  = fromCanvas,
                                ObjectName   = databaseColumn.ForeignConstraintName,
                                Message      = $"Foreign Key Constraint Exist on ERD Model but not in Database. ({databaseColumn.ColumnName})",
                                ObjectType   = ObjectTypeEnum.ForeignKeyConstraint,
                                ObjectAction = ObjectActionEnum.CreateInDatabase
                            });
                        }
                    }
                }
            }
        }
 private void SetupModel_Browse(object sender, string buttonKey)
 {
     EventParser.ParseMessage(sender, new ParseMessageEventArguments {
         Title = "SetupModel_Browse", Arguments = new object[] { buttonKey }
     });
 }
Exemplo n.º 17
0
 private void ParseBuildMessage(string message)
 {
     this.dispatcher.Invoke(() => { EventParser.ParseMessage(this, new ParseMessageEventArguments {
             Message = message
         }); });
 }
        public Dictionary <string, List <ColumnObjectModel> > GetInTableColumns(string[] tableNamesArray)
        {
            EventParser.ParseMessage(this, this.dispatcher, "Reading Tables", "");

            Dictionary <string, List <ColumnObjectModel> > result = new Dictionary <string, List <ColumnObjectModel> >();

            DataAccess dataAccess = new DataAccess(Connections.Instance.DatabaseModel);

            XDocument columnsXml = dataAccess.ExecuteQuery(SQLQueries.DatabaseQueries.DatabaseInTableColumnsQuery(tableNamesArray));

            Dictionary <string, List <XElement> > groupedTables = new Dictionary <string, List <XElement> >();

            foreach (XElement column in columnsXml.Root.Elements())
            {
                string tableName = column.Element("TABLENAME").Value;

                if (!groupedTables.ContainsKey(tableName))
                {
                    groupedTables.Add(tableName, new List <XElement>());
                }

                groupedTables[tableName].Add(column);
            }

            foreach (KeyValuePair <string, List <XElement> > tableColumns in groupedTables)
            {
                result.Add(tableColumns.Key, new List <ColumnObjectModel>());

                EventParser.ParseMessage(this, this.dispatcher, "Reading Columns for ", tableColumns.Key);

                string[] columnNamesArray = tableColumns.Value.Select(c => c.Element("COLUMNNAME").Value).ToArray();

                XDocument primaryKeys = dataAccess.ExecuteQuery(SQLQueries.DatabaseQueries.DatabaseInColumnKeysQuery(tableColumns.Key, columnNamesArray));

                foreach (XElement item in tableColumns.Value)
                {
                    string columnName = item.Element("COLUMNNAME").Value;

                    if (result[tableColumns.Key].Any(col => col.ColumnName == columnName))
                    {
                        continue;
                    }

                    string originalPosistion = item.Element("ORDINAL_POSITION").Value;

                    XElement primaryKey = primaryKeys.Root.Elements()
                                          .FirstOrDefault(el => el.Element("COLUMN_NAME").Value == columnName &&
                                                          el.Element("CONSTRAINT_TYPE").Value == "PRIMARY KEY");

                    ColumnObjectModel column = new ColumnObjectModel
                    {
                        ColumnName            = columnName,
                        IsIdentity            = item.Element("IS_IDENTITY").Value.ToBool(),
                        AllowNulls            = item.Element("IS_NULLABLE").Value.ToBool(),
                        MaxLength             = item.Element("MAX_LENGTH").Value.ToInt32(),
                        Precision             = item.Element("PRECISION").Value.ToInt32(),
                        Scale                 = item.Element("SCALE").Value.ToInt32(),
                        IsForeignkey          = !item.Element("PRIMARY_TABLE").Value.IsNullEmptyOrWhiteSpace(),
                        ForeignKeyTable       = item.Element("PRIMARY_TABLE").Value,
                        ForeignKeyColumn      = item.Element("PRIMARY_COLUMNNAME").Value,
                        ForeignConstraintName = item.Element("FK_CONSTRAINT_NAME").Value,
                        SqlDataType           = this.ParseSqlDbType(item.Element("DATA_TYPE").Value),
                        InPrimaryKey          = primaryKey == null ? false : primaryKey.Descendants().Any(d => d.Value == "PRIMARY KEY"),
                        Column_Id             = item.Element("COLUMN_ID").Value.ToInt32(),
                        OriginalPosition      = originalPosistion.IsNullEmptyOrWhiteSpace() ? 0 : originalPosistion.ToInt32()
                    };

                    column.HasModelChanged = false;

                    result[tableColumns.Key].Add(column);
                }
            }

            return(result);
        }