Exemplo n.º 1
0
 private void CheckDatabaseOk(CompareLog log, IRelationalModelAnnotations modelRel, DatabaseModel databaseModel)
 {
     //Check sequences
     //var logger = new CompareLogger(CompareType.Sequence, <sequence name>, _logs);
 }
        private void CompareColumns(CompareLog log, IEntityType entityType, DatabaseTable table)
        {
            var isView         = entityType.GetTableName() == null;
            var primaryKeyDict = table.PrimaryKey?.Columns.ToDictionary(x => x.Name, _caseComparer)
                                 ?? new Dictionary <string, DatabaseColumn>();
            var  efPKeyConstraintName = isView ? NoPrimaryKey :  entityType.FindPrimaryKey()?.GetName() ?? NoPrimaryKey;
            bool pKeyError            = false;
            var  pKeyLogger           = new CompareLogger2(CompareType.PrimaryKey, efPKeyConstraintName, log.SubLogs, _ignoreList,
                                                           () =>
            {
                pKeyError  = true;     //extra set of pKeyError
                _hasErrors = true;
            });

            if (!isView)
            {
                pKeyLogger.CheckDifferent(efPKeyConstraintName, table.PrimaryKey?.Name ?? NoPrimaryKey,
                                          CompareAttributes.ConstraintName, _caseComparison);
            }

            var columnDict = table.Columns.ToDictionary(x => x.Name, _caseComparer);

            // SQL Server only feature. Will not affect other databases
            var temporalColumnIgnores = table.GetAnnotations()
#pragma warning disable EF1001 // Internal EF Core API usage.
                                        .Where(a => a.Name == SqlServerAnnotationNames.TemporalPeriodStartPropertyName ||
                                               a.Name == SqlServerAnnotationNames.TemporalPeriodEndPropertyName)
#pragma warning restore EF1001 // Internal EF Core API usage.
                                        .Select(a => (string)a.Value)
                                        .ToArray();

            //This finds all the Owned Types and THP
            foreach (var property in entityType.GetProperties())
            {
                // Ignore temporal shadow properties (SQL Server)
                if (property.IsShadowProperty() && temporalColumnIgnores.Contains(property.Name))
                {
                    continue;
                }

                var colLogger  = new CompareLogger2(CompareType.Property, property.Name, log.SubLogs, _ignoreList, () => _hasErrors = true);
                var columnName = GetColumnNameTakingIntoAccountSchema(property, table, isView);
                if (columnName == null)
                {
                    //This catches properties in TPH, split tables, and Owned Types where the properties are not mapped to the current table
                    continue;
                }
                if (columnDict.ContainsKey(columnName))
                {
                    var reColumn = GetRelationalColumn(columnName, table, isView);
                    var error    = ComparePropertyToColumn(reColumn, colLogger, property, columnDict[columnName], isView);
                    //check for primary key
                    if (property.IsPrimaryKey() &&
                        //This remove TPH, Owned Types primary key checks
                        !isView != primaryKeyDict.ContainsKey(columnName))
                    {
                        if (!primaryKeyDict.ContainsKey(columnName))
                        {
                            pKeyLogger.NotInDatabase(columnName, CompareAttributes.ColumnName);
                            error = true;
                        }
                        else
                        {
                            pKeyLogger.ExtraInDatabase(columnName, CompareAttributes.ColumnName,
                                                       table.PrimaryKey.Name);
                        }
                    }

                    if (!error)
                    {
                        //There were no errors noted, so we mark it as OK
                        colLogger.MarkAsOk(columnName);
                    }
                }
                else
                {
                    colLogger.NotInDatabase(GetColumnNameTakingIntoAccountSchema(property, table), CompareAttributes.ColumnName);
                }
            }
            if (!pKeyError)
            {
                pKeyLogger.MarkAsOk(efPKeyConstraintName);
            }
        }
 private void CheckDatabaseOk(CompareLog log, IModel modelRel, DatabaseModel databaseModel)
 {
     //Check sequences
     //var logger = new CompareLogger2(CompareType.Sequence, <sequence name>, _logs);
 }
Exemplo n.º 4
0
        private void CompareColumns(CompareLog log, IEntityType entityType, DatabaseTable table)
        {
            var isView         = entityType.GetTableName() == null;
            var primaryKeyDict = table.PrimaryKey?.Columns.ToDictionary(x => x.Name, _caseComparer)
                                 ?? new Dictionary <string, DatabaseColumn>();
            var  efPKeyConstraintName = isView ? NoPrimaryKey :  entityType.FindPrimaryKey()?.GetName() ?? NoPrimaryKey;
            bool pKeyError            = false;
            var  pKeyLogger           = new CompareLogger2(CompareType.PrimaryKey, efPKeyConstraintName, log.SubLogs, _ignoreList,
                                                           () =>
            {
                pKeyError  = true;     //extra set of pKeyError
                _hasErrors = true;
            });

            if (!isView)
            {
                pKeyLogger.CheckDifferent(efPKeyConstraintName, table.PrimaryKey?.Name ?? NoPrimaryKey,
                                          CompareAttributes.ConstraintName, _caseComparison);
            }

            var columnDict = table.Columns.ToDictionary(x => x.Name, _caseComparer);

            //This finds all the Owned Types and THP
            foreach (var property in entityType.GetProperties())
            {
                var colLogger  = new CompareLogger2(CompareType.Property, property.Name, log.SubLogs, _ignoreList, () => _hasErrors = true);
                var columnName = GetColumnNameTakingIntoAccountSchema(property, table, isView);
                if (columnName == null)
                {
                    //This catches properties in TPH, split tables, and Owned Types where the properties are not mapped to the current table
                    continue;
                }
                if (columnDict.ContainsKey(columnName))
                {
                    var reColumn = GetRelationalColumn(columnName, table, isView);
                    var error    = ComparePropertyToColumn(reColumn, colLogger, property, columnDict[columnName], isView);
                    //check for primary key
                    if (property.IsPrimaryKey() &&
                        //This remove TPH, Owned Types primary key checks
                        !isView != primaryKeyDict.ContainsKey(columnName))
                    {
                        if (!primaryKeyDict.ContainsKey(columnName))
                        {
                            pKeyLogger.NotInDatabase(columnName, CompareAttributes.ColumnName);
                            error = true;
                        }
                        else
                        {
                            pKeyLogger.ExtraInDatabase(columnName, CompareAttributes.ColumnName,
                                                       table.PrimaryKey.Name);
                        }
                    }

                    if (!error)
                    {
                        //There were no errors noted, so we mark it as OK
                        colLogger.MarkAsOk(columnName);
                    }
                }
                else
                {
                    colLogger.NotInDatabase(GetColumnNameTakingIntoAccountSchema(property, table), CompareAttributes.ColumnName);
                }
            }
            if (!pKeyError)
            {
                pKeyLogger.MarkAsOk(efPKeyConstraintName);
            }
        }