public async Task <bool> HashesMatch(DbConnection con, string tableName, TypeMap typeMap) { const string HASH_COLUMN = "Hash"; string getHashRecord = $"select {HASH_COLUMN} from AnalyzedModelHashes where TableName='{tableName}'"; string existingHash = await con.RunCommandGetString(getHashRecord, HASH_COLUMN); string newHash = typeMap.EncodeToBase64(); if (existingHash == newHash) { return(true); } if (existingHash == string.Empty) { await CreateTableFromTypeMap(con, tableName, typeMap); return(false); } TypeMap existing = TypeMap.DecodeFromBase64(existingHash); TypeMapDifferences differences = existing.GetDifferences(typeMap); foreach (TypeMapDifference difference in differences) { if (difference.DifferenceType == DifferenceType.DataTypeChange) { throw new Exception($"Difference types {nameof(DifferenceType.DataTypeChange)}, " + $" not supported. \n" + $"Column: {difference.ColumnKey}"); } if (difference.DifferenceType == DifferenceType.ChangedColumnOrder) { //TODO: Better handling. //ignore for now } if (difference.DifferenceType == DifferenceType.AddedColumn) { NodeProperties node = typeMap[difference.ColumnKey]; string alterState = $"ALTER TABLE {typeMap.Name} ADD COLUMN {difference.ColumnKey} {SqlTranslator.SqlTypeFromInternalType(node.InternalType, this).SqlType};"; await con.RunCommandAsync(alterState); } } return(false); }