Example #1
0
        public void ValidateSchema(SchemaValidationOptions validationOptions = null)
        {
            if (validationOptions == null)
            {
                validationOptions = new SchemaValidationOptions();
            }

            var databaseModel = GetDatabaseModel();

            var entityModel      = Context.Model;
            var validationErrors = new List <string>();
            var persistedTypes   = entityModel.GetEntityTypes().Where(entityType => !entityType.IsQueryType);

            foreach (var persistedType in persistedTypes)
            {
                var entityTable = persistedType.Relational();
                var dbTable     = databaseModel.GetTable(persistedType);

                if (dbTable == null)
                {
                    validationErrors.Add($"Missing table: {entityTable.TableName}");
                    continue;
                }

                validationErrors.AddRange(ValidateColumns(databaseModel, persistedType, validationOptions));

                if (validationOptions.ValidateIndexes)
                {
                    validationErrors.AddRange(ValidateIndexes(databaseModel, persistedType));
                }

                if (validationOptions.ValidateForeignKeys)
                {
                    validationErrors.AddRange(ValidateForeignKeys(databaseModel, persistedType));
                }
            }

            if (validationErrors.Count > 0)
            {
                throw new SchemaValidationException("Schema validation failed", validationErrors);
            }
        }
Example #2
0
        public void ValidateSchema(SchemaValidationOptions validationOptions = null)
        {
            if (validationOptions == null)
            {
                validationOptions = new SchemaValidationOptions();
            }

            var databaseModel = GetDatabaseModel();

            var entityModel      = Context.Model;
            var validationErrors = new List <string>();
            var persistedTypes   = entityModel.GetEntityTypes();

            foreach (var persistedType in persistedTypes)
            {
                if (databaseModel.GetTable(persistedType) == null)
                {
                    validationErrors.Add(persistedType.FindAnnotation(RelationalAnnotationNames.ViewDefinition) != null
                                             ? $"Missing view: {persistedType.GetTableName()}"
                                             : $"Missing table: {persistedType.GetTableName()}");

                    continue;
                }

                validationErrors.AddRange(ValidateColumns(databaseModel, persistedType, validationOptions));

                if (validationOptions.ValidateIndexes && persistedType.FindAnnotation(RelationalAnnotationNames.ViewDefinition) == null)
                {
                    validationErrors.AddRange(ValidateIndexes(databaseModel, persistedType));
                }

                if (validationOptions.ValidateForeignKeys && persistedType.FindAnnotation(RelationalAnnotationNames.ViewDefinition) == null)
                {
                    validationErrors.AddRange(ValidateForeignKeys(databaseModel, persistedType));
                }
            }

            if (validationErrors.Count > 0)
            {
                throw new SchemaValidationException("Schema validation failed", validationErrors);
            }
        }
Example #3
0
        private List <string> ValidateColumns(DatabaseModel databaseModel, IEntityType persistedType, SchemaValidationOptions validationOptions)
        {
            var entityTable = persistedType.Relational();
            var valErrors   = new List <string>();

            foreach (var entityProperty in persistedType.GetProperties())
            {
                var entityColumn = entityProperty.Relational();

                var dbColumn = databaseModel.GetColumn(entityProperty);
                if (dbColumn == null)
                {
                    valErrors.Add($"Missing column: {entityColumn.ColumnName} in {entityTable.TableName}");
                    continue;
                }

                var columnTypesMatch =
                    dbColumn.StoreType.Equals(entityColumn.ColumnType, StringComparison.OrdinalIgnoreCase);
                if (!columnTypesMatch)
                {
                    valErrors.Add(
                        $"Column type mismatch in {entityTable.TableName} for column {entityColumn.ColumnName}. Found: {dbColumn.StoreType.ToLowerInvariant()}, Expected {entityColumn.ColumnType.ToLowerInvariant()}");
                }

                var shouldValidateColumnNullability = validationOptions.ValidateNullabilityForTables;
                if (shouldValidateColumnNullability && entityProperty.IsNullable != dbColumn.IsNullable)
                {
                    valErrors.Add(
                        $"Column nullability mismatch in {entityTable.TableName} for column {entityColumn.ColumnName}. Found: {(dbColumn.IsNullable ? "Nullable" : "NotNullable")}, Expected {(entityProperty.IsNullable ? "Nullable" : "NotNullable")}");
                }
            }

            return(valErrors);
        }
        public static void ValidateSchema(this DbContext context, SchemaValidationOptions validationOptions = null)
        {
            var validator = new SchemaValidator(context);

            validator.ValidateSchema(validationOptions ?? new SchemaValidationOptions());
        }
Example #5
0
        private List <string> ValidateColumns(DatabaseModel databaseModel, IEntityType persistedType, SchemaValidationOptions validationOptions)
        {
            var valErrors = new List <string>();

            foreach (var persistedColumn in persistedType.GetProperties())
            {
                var dbColumn = databaseModel.GetColumn(persistedColumn);
                if (dbColumn == null)
                {
                    valErrors.Add($"Missing column: {persistedColumn.GetColumnName()} in {persistedType.GetTableName()}");
                    continue;
                }

                var columnTypesMatch =
                    dbColumn.StoreType.Equals(persistedColumn.GetColumnType(), StringComparison.OrdinalIgnoreCase);
                if (!columnTypesMatch)
                {
                    valErrors.Add(
                        $"Column type mismatch in {persistedType.GetTableName()} for column {persistedColumn.GetColumnName()}. Found: {dbColumn.StoreType.ToLowerInvariant()}, Expected {persistedColumn.GetColumnType().ToLowerInvariant()}");
                }

                var isViewType = persistedType.FindAnnotation(RelationalAnnotationNames.ViewDefinition) != null;
                var shouldValidateColumnNullability = (validationOptions.ValidateNullabilityForTables && !isViewType) || (validationOptions.ValidateNullabilityForViews && isViewType);
                if (shouldValidateColumnNullability && persistedColumn.IsNullable != dbColumn.IsNullable)
                {
                    valErrors.Add(
                        $"Column nullability mismatch in {persistedType.GetTableName()} for column {persistedColumn.GetColumnName()}. Found: {(dbColumn.IsNullable ? "Nullable" : "NotNullable")}, Expected {(persistedColumn.IsNullable ? "Nullable" : "NotNullable")}");
                }
            }

            return(valErrors);
        }