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); } }
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); } }
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()); }
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); }