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