diff --git a/SQLSchemaCompare.CLI/SQLSchemaCompare.CLI.csproj b/SQLSchemaCompare.CLI/SQLSchemaCompare.CLI.csproj index 48fbd15..de45a92 100644 --- a/SQLSchemaCompare.CLI/SQLSchemaCompare.CLI.csproj +++ b/SQLSchemaCompare.CLI/SQLSchemaCompare.CLI.csproj @@ -20,13 +20,13 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/SQLSchemaCompare.CLI/packages.lock.json b/SQLSchemaCompare.CLI/packages.lock.json index a48fa5e..1f1fdb8 100644 --- a/SQLSchemaCompare.CLI/packages.lock.json +++ b/SQLSchemaCompare.CLI/packages.lock.json @@ -4,11 +4,11 @@ "net10.0": { "Neolution.CodeAnalysis": { "type": "Direct", - "requested": "[3.2.2, )", - "resolved": "3.2.2", - "contentHash": "9eBWPh7DNlBje/vH1q5Z4Q5FjwahYavPE2NsJO78IRcQ0xDrhor2FY8DxLA26BsweMqn4Ej0cN5dnyFexjl+ww==", + "requested": "[3.3.0-beta.2, )", + "resolved": "3.3.0-beta.2", + "contentHash": "88mG4f4P16K4Ql3uTqeaoeXGJLNMReFh9z3ZKmKZ0bY4RTk4z4syjuF/TefouGM2hR+mcBSdWbAtsKT/+FowlA==", "dependencies": { - "SonarAnalyzer.CSharp": "9.20.0.85982", + "SonarAnalyzer.CSharp": "9.32.0.97167", "StyleCop.Analyzers.Unstable": "1.2.0.556" } }, @@ -32,11 +32,11 @@ }, "Spectre.Console.Cli.Extensions.DependencyInjection": { "type": "Direct", - "requested": "[0.24.0, )", - "resolved": "0.24.0", - "contentHash": "hr4hp++FJdQK0InxAQ0Ba3BfzsGS+s4EWMM7NWPLpLCLHlmSlGm2Gyho3Rz4i3NeQjNSjmGf+NGh7//ufjuHEQ==", + "requested": "[0.25.0, )", + "resolved": "0.25.0", + "contentHash": "MVhVuErdBt9Lm10MboaJriu/7vf5+WpgQEQ2U/g7FMx3zF7WqRbM+KV0GSFsEgIWorgfTX/ke4akZ9rZd9644g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.5", + "Microsoft.Extensions.DependencyInjection": "10.0.8", "Spectre.Console.Cli": "0.55.0" } }, @@ -103,120 +103,120 @@ }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "G6yclVO5/csPzzsymV0SemY2NDqE31CP5M3jprF5IuO9wJsh4aUOfYD8HCLuDmM1D1CfReegVic48O2r79d46Q==", + "resolved": "10.0.8", + "contentHash": "EJx+fIBMgBlgD+ublKCn+GTOJkw3UqV7xOjYWBRVdUYyIm8UfvAsmSOPFiIInsWTHyMEYUJ9gCJY1jwX+6UB7w==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "10.0.7", - "Microsoft.EntityFrameworkCore.Analyzers": "10.0.7", - "Microsoft.Extensions.Caching.Memory": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7" + "Microsoft.EntityFrameworkCore.Abstractions": "10.0.8", + "Microsoft.EntityFrameworkCore.Analyzers": "10.0.8", + "Microsoft.Extensions.Caching.Memory": "10.0.8", + "Microsoft.Extensions.Logging": "10.0.8" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "TuxExnfIS/bSq3z2CbH0LwZH1oyj9iHhSGneU4fpxl3ikjZGZdSae9gcfnImV1rufH8f/ab1NnHwyL2BLyeZOg==" + "resolved": "10.0.8", + "contentHash": "jbKDXWPZQhuPHygMnwzNOqxBADVcpRVytcKYZsA++QqhPkpF93Ta8o5mbJQGrARSjlkr9WtOaADV97EDMOZ7DA==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "eZnMyiJzo249Ejg5CaFScvJS0u7neQfS9DXknAHTO6FHVMM99gO0byNXHGZmA/BOkZ13ngeVziQLHTMOtgescg==" + "resolved": "10.0.8", + "contentHash": "M3BZ8JH8rB6BE7dO2g9iVbrHLnEz9wMXT6q+tDR6Nq3gyP3KmBj5OTiZGxyF3vesjOQNKanYoPGSNBR4kR2llg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "midwPufIwXhOJcVhaZpCZGNbjy2QoPfHI+70nw2dGcoULEW9DybMvMPYkRjOJV0eI46a1oVFhU4lFYDEx6YUbg==", + "resolved": "10.0.8", + "contentHash": "UU3diAD2wwZveye2rnrwaF/wvJ9tm5iL2fuY9TTap6/iGQK1OO29M1BzXZRlRPVH/dByt5w/pISBSFtyR7hTqw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "10.0.7", - "Microsoft.Extensions.Caching.Memory": "10.0.7", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7" + "Microsoft.EntityFrameworkCore": "10.0.8", + "Microsoft.Extensions.Caching.Memory": "10.0.8", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", + "Microsoft.Extensions.Logging": "10.0.8" } }, "Microsoft.EntityFrameworkCore.SqlServer": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "jci/dpjLIZyrp0Kbt0kr1lh+7BXbJ3wNk+vTwS/Se65grEJSBC+eE2UAQsi/xSNB5lHP2dysyOMHugkpFwQwNA==", + "resolved": "10.0.8", + "contentHash": "A+FLIsTH9l5DG2iD6QW6Mfwlvr+BjWme/jJ2hvwmmENTr7lR1UWmgCtKCjDYcHxqdAD15bb4PgQnSzw12DV/pw==", "dependencies": { "Microsoft.Data.SqlClient": "6.1.1", - "Microsoft.EntityFrameworkCore.Relational": "10.0.7", - "Microsoft.Extensions.Caching.Memory": "10.0.7", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7" + "Microsoft.EntityFrameworkCore.Relational": "10.0.8", + "Microsoft.Extensions.Caching.Memory": "10.0.8", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", + "Microsoft.Extensions.Logging": "10.0.8" } }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "pUDgQKEqNUFlerDIFRg7zzoDVRPEWIG7nR40h8Gzg8RXza4Ry0lWZ7u91bmwu3iUDCxw3Dv6TLHVFoAgY0gy7Q==", + "resolved": "10.0.8", + "contentHash": "EoK2TwVR1daxmfXUPnvIYZSk5XQjHe45sGekox4kvMt88KQZQhDVzYW5Na5+oNwTuRpE48hipyGJg12F1Tm70w==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.7" + "Microsoft.Extensions.Primitives": "10.0.8" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "6eULH/sc97yfCEV31g7AgUzHc7dIm0DGBcofoE8GgBaXbdAPPhathN8rYcgi1TSiG1QucCdqKiVNaDEPAEXL5Q==", + "resolved": "10.0.8", + "contentHash": "sYMYQjNprfqPTryuLNnr0/AOtnhlfuZ0ZxyOV0d3AXOEL8j9KV0EbelpZYyIatT2hJiaSGO9XGr5YDRsh22OfQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "10.0.7", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging.Abstractions": "10.0.7", - "Microsoft.Extensions.Options": "10.0.7", - "Microsoft.Extensions.Primitives": "10.0.7" + "Microsoft.Extensions.Caching.Abstractions": "10.0.8", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", + "Microsoft.Extensions.Logging.Abstractions": "10.0.8", + "Microsoft.Extensions.Options": "10.0.8", + "Microsoft.Extensions.Primitives": "10.0.8" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "t56nEgvECcyLPojZIUFWJknQQDAbgfTf9J+QMYJE1YYvVgz69vN6B/AKL8Grvj3Lcnp8kTpNqwmwFhb3YLJmtQ==", + "resolved": "10.0.8", + "contentHash": "I63esIFbL3h5pSt7gXpXOlmcwDmYBUoYNEglKfDPFUqtYvSV84f2l28hO2lfVXsV0wdlplgAM7IVz16matapSg==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.7" + "Microsoft.Extensions.Primitives": "10.0.8" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "91F/o3emPV/+xY/ip3s2LqDNF14kjttlVtq0BXgg6p4MnCzeSZxnUJm+t6WRrtD3JdGo88/oX+z7OwK4y8PZuw==", + "resolved": "10.0.8", + "contentHash": "daf62xHIrq8pnE709hgaZZN9tSam9TGGepWe1+bE6V3GEuVwJiMs6ib+38lfMCyAJAHiX0vapxBhsuMSV7U+cg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "Z6mfFEaFcwCfSboxJwOLfu7/31npCY9q70WUamHW/vRQhDvBKOT4Vf9YkZj5J6hLvJpb0oDEYfHunQZj0xxvKw==" + "resolved": "10.0.8", + "contentHash": "21nbDV60SRPWGIivsyl6lqBeEJNG1sginhhfWgRrr3Ais7aQ12To25OAHQxgoiJkjqy1aQ6RxpZBGYuTi7Ge6A==" }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "hOeRIQ63GkgiYCB/MIFp+LQs8aXpJXpB55t6Aj37ab7t2/6WeFcPXxYM9hdy/o5tffzwf8mhqzLJP6mjGYCxjw==", + "resolved": "10.0.8", + "contentHash": "K60JhWC2hN/Gi7TP68tBxSzk5ACWOs7lkmPzsfA8Bcf/IXTajujt2ORMf9rSMk1bsng6Lv4Y3fuxp3bm1+15ug==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.7", - "Microsoft.Extensions.Logging.Abstractions": "10.0.7", - "Microsoft.Extensions.Options": "10.0.7" + "Microsoft.Extensions.DependencyInjection": "10.0.8", + "Microsoft.Extensions.Logging.Abstractions": "10.0.8", + "Microsoft.Extensions.Options": "10.0.8" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "tIEcQ2gvERrH2KiCjdsVcHGhXt9lIsuDStfOIeZWr7/fP8IXhGiYfx0/80PNI7WPO2IYuFtlZLSlnTS8+/Mchw==", + "resolved": "10.0.8", + "contentHash": "fdVadZmsC8jRP0KvKy8mO8f6GV/HyBvElfcSxEhd+5FM5boAw/01iSaCto5G3G37ApJira4A3pNaVvBv8cUiLQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "00SHUGTh2jSMvIr6x9Xwd2nE+B5/qFCO/9hDwUDhJsjYRDlADmaBZ7tqehXzBDsfjHSXJzuRHJzPYPPjphBQ7Q==", + "resolved": "10.0.8", + "contentHash": "VBD+131DpTNCNDfA4kIyKTiCySvJGNhwibdWBSdFRu7GMfXLXcXODkgA+KStKbbhzraLglZWUN4nXyHgW4JIRA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Primitives": "10.0.7" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", + "Microsoft.Extensions.Primitives": "10.0.8" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "D5M0Jr551iTgwkZMN9rm0pSkgNLj5quUWQUmQPMZh7k/bnvZTnXRGfE2KuvXf1EEjt/ofD9yw9IumpgdP9QCnw==" + "resolved": "10.0.8", + "contentHash": "OBPo4nYhMyIbtueoC10CBm6AGAbo/A9IV8QQ/6ryZS7VvmqpGT7hunazeHLxFawRzn3oLOq4jhqhpBX4tfswWQ==" }, "Microsoft.Identity.Client": { "type": "Transitive", @@ -288,10 +288,10 @@ }, "Microting.EntityFrameworkCore.MySql": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "FNohIzR0HuCsGNc8kHDeICt3cReGCGO0mZ5SOzcTlmZZgZux7GN/ekBcjGb2LwT81wJIi0R5Xh1xZrPXvF7m9A==", + "resolved": "10.0.8", + "contentHash": "vaxt+8dU7WODnxl5/2k4VH+LNgbQHk+yGIqWum619+6lICCmbLHyYyzqgJRGzic+Aeyh212TeH5fHklfXAjWVw==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "[10.0.7, 10.0.999]", + "Microsoft.EntityFrameworkCore.Relational": "[10.0.8, 10.0.999]", "MySqlConnector": "2.5.0" } }, @@ -337,8 +337,8 @@ }, "SonarAnalyzer.CSharp": { "type": "Transitive", - "resolved": "9.20.0.85982", - "contentHash": "c0IYtFg4mYusTafTy0Bs5wev45vRKNShkuoWyQyPMbC6imEFHL7tY/7xbbUJd6JNLYx5vP8wyi2LgiBsMHqb2Q==" + "resolved": "9.32.0.97167", + "contentHash": "Yxk86RV+8ynJpUhku1Yw2hITFmnmXKkXJ73cIFSy85ol5SnWREQg9RuTyV8nI7V7+pyLKpCfRmD7P0widsgjkg==" }, "Spectre.Console.Ansi": { "type": "Transitive", @@ -411,9 +411,9 @@ "TiCodeX.SQLSchemaCompare.Infrastructure": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "[10.0.7, )", - "Microsoft.EntityFrameworkCore.SqlServer": "[10.0.7, )", - "Microting.EntityFrameworkCore.MySql": "[10.0.7, )", + "Microsoft.EntityFrameworkCore.Relational": "[10.0.8, )", + "Microsoft.EntityFrameworkCore.SqlServer": "[10.0.8, )", + "Microting.EntityFrameworkCore.MySql": "[10.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "[10.0.1, )", "TiCodeX.SQLSchemaCompare.Services": "[2026.5.1, )" } @@ -422,7 +422,7 @@ "type": "Project", "dependencies": { "Microsoft.AspNet.WebApi.Client": "[6.0.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.7, )", + "Microsoft.Extensions.Logging.Abstractions": "[10.0.8, )", "Newtonsoft.Json": "[13.0.4, )", "TiCodeX.SQLSchemaCompare.Core": "[2026.5.1, )" } diff --git a/SQLSchemaCompare.Core/SQLSchemaCompare.Core.csproj b/SQLSchemaCompare.Core/SQLSchemaCompare.Core.csproj index 2ea2d51..132427a 100644 --- a/SQLSchemaCompare.Core/SQLSchemaCompare.Core.csproj +++ b/SQLSchemaCompare.Core/SQLSchemaCompare.Core.csproj @@ -7,7 +7,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/SQLSchemaCompare.Core/packages.lock.json b/SQLSchemaCompare.Core/packages.lock.json index 038b4f5..9cbc8b5 100644 --- a/SQLSchemaCompare.Core/packages.lock.json +++ b/SQLSchemaCompare.Core/packages.lock.json @@ -4,11 +4,11 @@ "net10.0": { "Neolution.CodeAnalysis": { "type": "Direct", - "requested": "[3.2.2, )", - "resolved": "3.2.2", - "contentHash": "9eBWPh7DNlBje/vH1q5Z4Q5FjwahYavPE2NsJO78IRcQ0xDrhor2FY8DxLA26BsweMqn4Ej0cN5dnyFexjl+ww==", + "requested": "[3.3.0-beta.2, )", + "resolved": "3.3.0-beta.2", + "contentHash": "88mG4f4P16K4Ql3uTqeaoeXGJLNMReFh9z3ZKmKZ0bY4RTk4z4syjuF/TefouGM2hR+mcBSdWbAtsKT/+FowlA==", "dependencies": { - "SonarAnalyzer.CSharp": "9.20.0.85982", + "SonarAnalyzer.CSharp": "9.32.0.97167", "StyleCop.Analyzers.Unstable": "1.2.0.556" } }, @@ -20,8 +20,8 @@ }, "SonarAnalyzer.CSharp": { "type": "Transitive", - "resolved": "9.20.0.85982", - "contentHash": "c0IYtFg4mYusTafTy0Bs5wev45vRKNShkuoWyQyPMbC6imEFHL7tY/7xbbUJd6JNLYx5vP8wyi2LgiBsMHqb2Q==" + "resolved": "9.32.0.97167", + "contentHash": "Yxk86RV+8ynJpUhku1Yw2hITFmnmXKkXJ73cIFSy85ol5SnWREQg9RuTyV8nI7V7+pyLKpCfRmD7P0widsgjkg==" }, "StyleCop.Analyzers.Unstable": { "type": "Transitive", diff --git a/SQLSchemaCompare.Infrastructure/DatabaseProviders/ADatabaseProvider.cs b/SQLSchemaCompare.Infrastructure/DatabaseProviders/ADatabaseProvider.cs index a0c8770..97f926b 100644 --- a/SQLSchemaCompare.Infrastructure/DatabaseProviders/ADatabaseProvider.cs +++ b/SQLSchemaCompare.Infrastructure/DatabaseProviders/ADatabaseProvider.cs @@ -69,7 +69,7 @@ protected TDatabase DiscoverDatabase(TDatabaseContext context, TaskInfo taskInfo ArgumentNullException.ThrowIfNull(taskInfo); - this.Logger.LogInformation($"DiscoverDatabase started for database '{context.DatabaseName}' on server '{context.Hostname}'"); + this.Logger.LogInformation("DiscoverDatabase started for database '{DatabaseName}' on server '{Hostname}'", context.DatabaseName, context.Hostname); var db = new TDatabase { Name = context.DatabaseName }; var columns = new List(); @@ -96,7 +96,7 @@ protected TDatabase DiscoverDatabase(TDatabaseContext context, TaskInfo taskInfo { taskInfo.Percentage = 8; var version = this.GetServerVersion(context); - this.Logger.LogInformation($"Server '{context.Hostname}' version: {version}"); + this.Logger.LogInformation("Server '{Hostname}' version: {Version}", context.Hostname, version); if (Version.TryParse(version, out var result)) { this.CurrentServerVersion = db.ServerVersion = result; diff --git a/SQLSchemaCompare.Infrastructure/DatabaseProviders/MicrosoftSqlDatabaseProvider.cs b/SQLSchemaCompare.Infrastructure/DatabaseProviders/MicrosoftSqlDatabaseProvider.cs index ab774ea..662fc17 100644 --- a/SQLSchemaCompare.Infrastructure/DatabaseProviders/MicrosoftSqlDatabaseProvider.cs +++ b/SQLSchemaCompare.Infrastructure/DatabaseProviders/MicrosoftSqlDatabaseProvider.cs @@ -299,7 +299,7 @@ protected override IEnumerable GetDataTypes(MicrosoftSqlDatabas { if (type.IsTableType) { - this.Logger.LogError($"Unsupported User-Defined Table Type: {type.Name}"); + this.Logger.LogError("Unsupported User-Defined Table Type: {TypeName}", type.Name); continue; } @@ -309,7 +309,7 @@ protected override IEnumerable GetDataTypes(MicrosoftSqlDatabas if (type.SystemType == null) { - this.Logger.LogError($"Unable to find corresponding system type for '{type.Name}'"); + this.Logger.LogError("Unable to find corresponding system type for '{TypeName}'", type.Name); continue; } } diff --git a/SQLSchemaCompare.Infrastructure/Repository/ProjectRepository.cs b/SQLSchemaCompare.Infrastructure/Repository/ProjectRepository.cs index 497f459..1d38c16 100644 --- a/SQLSchemaCompare.Infrastructure/Repository/ProjectRepository.cs +++ b/SQLSchemaCompare.Infrastructure/Repository/ProjectRepository.cs @@ -24,7 +24,7 @@ public ProjectRepository(ILoggerFactory loggerFactory) /// public CompareProject Read(string filename) { - this.logger.LogInformation($"Reading project file: {filename}"); + this.logger.LogInformation("Reading project file: {Filename}", filename); var xml = new XmlSerializer(typeof(CompareProject)); using var f = File.OpenRead(filename); using var r = XmlReader.Create(f); @@ -34,11 +34,11 @@ public CompareProject Read(string filename) /// public void Write(CompareProject project, string filename) { - this.logger.LogInformation($"Writing project file: {filename}"); + this.logger.LogInformation("Writing project file: {Filename}", filename); if (!Directory.Exists(Path.GetDirectoryName(filename))) { - this.logger.LogInformation($"Creating folder: {Path.GetDirectoryName(filename)}"); + this.logger.LogInformation("Creating folder: {FolderName}", Path.GetDirectoryName(filename)); Directory.CreateDirectory(Path.GetDirectoryName(filename) ?? throw new InvalidOperationException()); } diff --git a/SQLSchemaCompare.Infrastructure/SQLSchemaCompare.Infrastructure.csproj b/SQLSchemaCompare.Infrastructure/SQLSchemaCompare.Infrastructure.csproj index 6cbf90c..d0ca1ab 100644 --- a/SQLSchemaCompare.Infrastructure/SQLSchemaCompare.Infrastructure.csproj +++ b/SQLSchemaCompare.Infrastructure/SQLSchemaCompare.Infrastructure.csproj @@ -5,10 +5,10 @@ - - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/SQLSchemaCompare.Infrastructure/packages.lock.json b/SQLSchemaCompare.Infrastructure/packages.lock.json index 16ca273..75615d8 100644 --- a/SQLSchemaCompare.Infrastructure/packages.lock.json +++ b/SQLSchemaCompare.Infrastructure/packages.lock.json @@ -4,46 +4,46 @@ "net10.0": { "Microsoft.EntityFrameworkCore.Relational": { "type": "Direct", - "requested": "[10.0.7, )", - "resolved": "10.0.7", - "contentHash": "midwPufIwXhOJcVhaZpCZGNbjy2QoPfHI+70nw2dGcoULEW9DybMvMPYkRjOJV0eI46a1oVFhU4lFYDEx6YUbg==", + "requested": "[10.0.8, )", + "resolved": "10.0.8", + "contentHash": "UU3diAD2wwZveye2rnrwaF/wvJ9tm5iL2fuY9TTap6/iGQK1OO29M1BzXZRlRPVH/dByt5w/pISBSFtyR7hTqw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "10.0.7", - "Microsoft.Extensions.Caching.Memory": "10.0.7", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7" + "Microsoft.EntityFrameworkCore": "10.0.8", + "Microsoft.Extensions.Caching.Memory": "10.0.8", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", + "Microsoft.Extensions.Logging": "10.0.8" } }, "Microsoft.EntityFrameworkCore.SqlServer": { "type": "Direct", - "requested": "[10.0.7, )", - "resolved": "10.0.7", - "contentHash": "jci/dpjLIZyrp0Kbt0kr1lh+7BXbJ3wNk+vTwS/Se65grEJSBC+eE2UAQsi/xSNB5lHP2dysyOMHugkpFwQwNA==", + "requested": "[10.0.8, )", + "resolved": "10.0.8", + "contentHash": "A+FLIsTH9l5DG2iD6QW6Mfwlvr+BjWme/jJ2hvwmmENTr7lR1UWmgCtKCjDYcHxqdAD15bb4PgQnSzw12DV/pw==", "dependencies": { "Microsoft.Data.SqlClient": "6.1.1", - "Microsoft.EntityFrameworkCore.Relational": "10.0.7", - "Microsoft.Extensions.Caching.Memory": "10.0.7", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7" + "Microsoft.EntityFrameworkCore.Relational": "10.0.8", + "Microsoft.Extensions.Caching.Memory": "10.0.8", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", + "Microsoft.Extensions.Logging": "10.0.8" } }, "Microting.EntityFrameworkCore.MySql": { "type": "Direct", - "requested": "[10.0.7, )", - "resolved": "10.0.7", - "contentHash": "FNohIzR0HuCsGNc8kHDeICt3cReGCGO0mZ5SOzcTlmZZgZux7GN/ekBcjGb2LwT81wJIi0R5Xh1xZrPXvF7m9A==", + "requested": "[10.0.8, )", + "resolved": "10.0.8", + "contentHash": "vaxt+8dU7WODnxl5/2k4VH+LNgbQHk+yGIqWum619+6lICCmbLHyYyzqgJRGzic+Aeyh212TeH5fHklfXAjWVw==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "[10.0.7, 10.0.999]", + "Microsoft.EntityFrameworkCore.Relational": "[10.0.8, 10.0.999]", "MySqlConnector": "2.5.0" } }, "Neolution.CodeAnalysis": { "type": "Direct", - "requested": "[3.2.2, )", - "resolved": "3.2.2", - "contentHash": "9eBWPh7DNlBje/vH1q5Z4Q5FjwahYavPE2NsJO78IRcQ0xDrhor2FY8DxLA26BsweMqn4Ej0cN5dnyFexjl+ww==", + "requested": "[3.3.0-beta.2, )", + "resolved": "3.3.0-beta.2", + "contentHash": "88mG4f4P16K4Ql3uTqeaoeXGJLNMReFh9z3ZKmKZ0bY4RTk4z4syjuF/TefouGM2hR+mcBSdWbAtsKT/+FowlA==", "dependencies": { - "SonarAnalyzer.CSharp": "9.20.0.85982", + "SonarAnalyzer.CSharp": "9.32.0.97167", "StyleCop.Analyzers.Unstable": "1.2.0.556" } }, @@ -121,97 +121,97 @@ }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "G6yclVO5/csPzzsymV0SemY2NDqE31CP5M3jprF5IuO9wJsh4aUOfYD8HCLuDmM1D1CfReegVic48O2r79d46Q==", + "resolved": "10.0.8", + "contentHash": "EJx+fIBMgBlgD+ublKCn+GTOJkw3UqV7xOjYWBRVdUYyIm8UfvAsmSOPFiIInsWTHyMEYUJ9gCJY1jwX+6UB7w==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "10.0.7", - "Microsoft.EntityFrameworkCore.Analyzers": "10.0.7", - "Microsoft.Extensions.Caching.Memory": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7" + "Microsoft.EntityFrameworkCore.Abstractions": "10.0.8", + "Microsoft.EntityFrameworkCore.Analyzers": "10.0.8", + "Microsoft.Extensions.Caching.Memory": "10.0.8", + "Microsoft.Extensions.Logging": "10.0.8" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "TuxExnfIS/bSq3z2CbH0LwZH1oyj9iHhSGneU4fpxl3ikjZGZdSae9gcfnImV1rufH8f/ab1NnHwyL2BLyeZOg==" + "resolved": "10.0.8", + "contentHash": "jbKDXWPZQhuPHygMnwzNOqxBADVcpRVytcKYZsA++QqhPkpF93Ta8o5mbJQGrARSjlkr9WtOaADV97EDMOZ7DA==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "eZnMyiJzo249Ejg5CaFScvJS0u7neQfS9DXknAHTO6FHVMM99gO0byNXHGZmA/BOkZ13ngeVziQLHTMOtgescg==" + "resolved": "10.0.8", + "contentHash": "M3BZ8JH8rB6BE7dO2g9iVbrHLnEz9wMXT6q+tDR6Nq3gyP3KmBj5OTiZGxyF3vesjOQNKanYoPGSNBR4kR2llg==" }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "pUDgQKEqNUFlerDIFRg7zzoDVRPEWIG7nR40h8Gzg8RXza4Ry0lWZ7u91bmwu3iUDCxw3Dv6TLHVFoAgY0gy7Q==", + "resolved": "10.0.8", + "contentHash": "EoK2TwVR1daxmfXUPnvIYZSk5XQjHe45sGekox4kvMt88KQZQhDVzYW5Na5+oNwTuRpE48hipyGJg12F1Tm70w==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.7" + "Microsoft.Extensions.Primitives": "10.0.8" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "6eULH/sc97yfCEV31g7AgUzHc7dIm0DGBcofoE8GgBaXbdAPPhathN8rYcgi1TSiG1QucCdqKiVNaDEPAEXL5Q==", + "resolved": "10.0.8", + "contentHash": "sYMYQjNprfqPTryuLNnr0/AOtnhlfuZ0ZxyOV0d3AXOEL8j9KV0EbelpZYyIatT2hJiaSGO9XGr5YDRsh22OfQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "10.0.7", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging.Abstractions": "10.0.7", - "Microsoft.Extensions.Options": "10.0.7", - "Microsoft.Extensions.Primitives": "10.0.7" + "Microsoft.Extensions.Caching.Abstractions": "10.0.8", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", + "Microsoft.Extensions.Logging.Abstractions": "10.0.8", + "Microsoft.Extensions.Options": "10.0.8", + "Microsoft.Extensions.Primitives": "10.0.8" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "t56nEgvECcyLPojZIUFWJknQQDAbgfTf9J+QMYJE1YYvVgz69vN6B/AKL8Grvj3Lcnp8kTpNqwmwFhb3YLJmtQ==", + "resolved": "10.0.8", + "contentHash": "I63esIFbL3h5pSt7gXpXOlmcwDmYBUoYNEglKfDPFUqtYvSV84f2l28hO2lfVXsV0wdlplgAM7IVz16matapSg==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.7" + "Microsoft.Extensions.Primitives": "10.0.8" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "91F/o3emPV/+xY/ip3s2LqDNF14kjttlVtq0BXgg6p4MnCzeSZxnUJm+t6WRrtD3JdGo88/oX+z7OwK4y8PZuw==", + "resolved": "10.0.8", + "contentHash": "daf62xHIrq8pnE709hgaZZN9tSam9TGGepWe1+bE6V3GEuVwJiMs6ib+38lfMCyAJAHiX0vapxBhsuMSV7U+cg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "Z6mfFEaFcwCfSboxJwOLfu7/31npCY9q70WUamHW/vRQhDvBKOT4Vf9YkZj5J6hLvJpb0oDEYfHunQZj0xxvKw==" + "resolved": "10.0.8", + "contentHash": "21nbDV60SRPWGIivsyl6lqBeEJNG1sginhhfWgRrr3Ais7aQ12To25OAHQxgoiJkjqy1aQ6RxpZBGYuTi7Ge6A==" }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "hOeRIQ63GkgiYCB/MIFp+LQs8aXpJXpB55t6Aj37ab7t2/6WeFcPXxYM9hdy/o5tffzwf8mhqzLJP6mjGYCxjw==", + "resolved": "10.0.8", + "contentHash": "K60JhWC2hN/Gi7TP68tBxSzk5ACWOs7lkmPzsfA8Bcf/IXTajujt2ORMf9rSMk1bsng6Lv4Y3fuxp3bm1+15ug==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.7", - "Microsoft.Extensions.Logging.Abstractions": "10.0.7", - "Microsoft.Extensions.Options": "10.0.7" + "Microsoft.Extensions.DependencyInjection": "10.0.8", + "Microsoft.Extensions.Logging.Abstractions": "10.0.8", + "Microsoft.Extensions.Options": "10.0.8" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "tIEcQ2gvERrH2KiCjdsVcHGhXt9lIsuDStfOIeZWr7/fP8IXhGiYfx0/80PNI7WPO2IYuFtlZLSlnTS8+/Mchw==", + "resolved": "10.0.8", + "contentHash": "fdVadZmsC8jRP0KvKy8mO8f6GV/HyBvElfcSxEhd+5FM5boAw/01iSaCto5G3G37ApJira4A3pNaVvBv8cUiLQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "00SHUGTh2jSMvIr6x9Xwd2nE+B5/qFCO/9hDwUDhJsjYRDlADmaBZ7tqehXzBDsfjHSXJzuRHJzPYPPjphBQ7Q==", + "resolved": "10.0.8", + "contentHash": "VBD+131DpTNCNDfA4kIyKTiCySvJGNhwibdWBSdFRu7GMfXLXcXODkgA+KStKbbhzraLglZWUN4nXyHgW4JIRA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Primitives": "10.0.7" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", + "Microsoft.Extensions.Primitives": "10.0.8" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "D5M0Jr551iTgwkZMN9rm0pSkgNLj5quUWQUmQPMZh7k/bnvZTnXRGfE2KuvXf1EEjt/ofD9yw9IumpgdP9QCnw==" + "resolved": "10.0.8", + "contentHash": "OBPo4nYhMyIbtueoC10CBm6AGAbo/A9IV8QQ/6ryZS7VvmqpGT7hunazeHLxFawRzn3oLOq4jhqhpBX4tfswWQ==" }, "Microsoft.Identity.Client": { "type": "Transitive", @@ -313,8 +313,8 @@ }, "SonarAnalyzer.CSharp": { "type": "Transitive", - "resolved": "9.20.0.85982", - "contentHash": "c0IYtFg4mYusTafTy0Bs5wev45vRKNShkuoWyQyPMbC6imEFHL7tY/7xbbUJd6JNLYx5vP8wyi2LgiBsMHqb2Q==" + "resolved": "9.32.0.97167", + "contentHash": "Yxk86RV+8ynJpUhku1Yw2hITFmnmXKkXJ73cIFSy85ol5SnWREQg9RuTyV8nI7V7+pyLKpCfRmD7P0widsgjkg==" }, "StyleCop.Analyzers.Unstable": { "type": "Transitive", @@ -383,7 +383,7 @@ "type": "Project", "dependencies": { "Microsoft.AspNet.WebApi.Client": "[6.0.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.7, )", + "Microsoft.Extensions.Logging.Abstractions": "[10.0.8, )", "Newtonsoft.Json": "[13.0.4, )", "TiCodeX.SQLSchemaCompare.Core": "[2026.5.1, )" } diff --git a/SQLSchemaCompare.Services/DatabaseCompareService.cs b/SQLSchemaCompare.Services/DatabaseCompareService.cs index ec7456d..5203e7d 100644 --- a/SQLSchemaCompare.Services/DatabaseCompareService.cs +++ b/SQLSchemaCompare.Services/DatabaseCompareService.cs @@ -280,8 +280,7 @@ private bool ExecuteDatabaseComparison(TaskInfo taskInfo) } catch (Exception ex) { - this.logger.LogError(ex.Message); - this.logger.LogError(ex.StackTrace); + this.logger.LogError(ex, "Error comparing databases"); throw; } } @@ -301,7 +300,7 @@ private void FillCompareResultItems(CompareResult result, CompareResultItems com result.DifferentItems.AddRange(compareResultItems.StoredProcedures.Where(x => x.SourceItem != null && x.TargetItem != null && !x.Equal).OrderBy(x => x.SourceItemName)); result.DifferentItems.AddRange(compareResultItems.Sequences.Where(x => x.SourceItem != null && x.TargetItem != null && !x.Equal).OrderBy(x => x.SourceItemName)); result.DifferentItems.AddRange(compareResultItems.DataTypes.Where(x => x.SourceItem != null && x.TargetItem != null && !x.Equal).OrderBy(x => x.SourceItemName)); - this.logger.LogDebug($"Different items => {result.DifferentItems.Count}"); + this.logger.LogDebug("Different items => {Count}", result.DifferentItems.Count); result.OnlySourceItems.AddRange(compareResultItems.Schemas.Where(x => x.SourceItem != null && x.TargetItem == null).OrderBy(x => x.SourceItemName)); result.OnlySourceItems.AddRange(compareResultItems.Tables.Where(x => x.SourceItem != null && x.TargetItem == null).OrderBy(x => x.SourceItemName)); @@ -310,7 +309,7 @@ private void FillCompareResultItems(CompareResult result, CompareResultItems com result.OnlySourceItems.AddRange(compareResultItems.StoredProcedures.Where(x => x.SourceItem != null && x.TargetItem == null).OrderBy(x => x.SourceItemName)); result.OnlySourceItems.AddRange(compareResultItems.Sequences.Where(x => x.SourceItem != null && x.TargetItem == null).OrderBy(x => x.SourceItemName)); result.OnlySourceItems.AddRange(compareResultItems.DataTypes.Where(x => x.SourceItem != null && x.TargetItem == null).OrderBy(x => x.SourceItemName)); - this.logger.LogDebug($"Only Source items => {result.OnlySourceItems.Count}"); + this.logger.LogDebug("Only Source items => {Count}", result.OnlySourceItems.Count); result.OnlyTargetItems.AddRange(compareResultItems.Schemas.Where(x => x.TargetItem != null && x.SourceItem == null).OrderBy(x => x.TargetItemName)); result.OnlyTargetItems.AddRange(compareResultItems.Tables.Where(x => x.TargetItem != null && x.SourceItem == null).OrderBy(x => x.TargetItemName)); @@ -319,7 +318,7 @@ private void FillCompareResultItems(CompareResult result, CompareResultItems com result.OnlyTargetItems.AddRange(compareResultItems.StoredProcedures.Where(x => x.TargetItem != null && x.SourceItem == null).OrderBy(x => x.TargetItemName)); result.OnlyTargetItems.AddRange(compareResultItems.Sequences.Where(x => x.TargetItem != null && x.SourceItem == null).OrderBy(x => x.TargetItemName)); result.OnlyTargetItems.AddRange(compareResultItems.DataTypes.Where(x => x.TargetItem != null && x.SourceItem == null).OrderBy(x => x.TargetItemName)); - this.logger.LogDebug($"Only Target items => {result.OnlyTargetItems.Count}"); + this.logger.LogDebug("Only Target items => {Count}", result.OnlyTargetItems.Count); result.SameItems.AddRange(compareResultItems.Schemas.Where(x => x.SourceItem != null && x.TargetItem != null && x.Equal).OrderBy(x => x.SourceItemName)); result.SameItems.AddRange(compareResultItems.Tables.Where(x => x.SourceItem != null && x.TargetItem != null && x.Equal).OrderBy(x => x.SourceItemName)); @@ -328,7 +327,7 @@ private void FillCompareResultItems(CompareResult result, CompareResultItems com result.SameItems.AddRange(compareResultItems.StoredProcedures.Where(x => x.SourceItem != null && x.TargetItem != null && x.Equal).OrderBy(x => x.SourceItemName)); result.SameItems.AddRange(compareResultItems.Sequences.Where(x => x.SourceItem != null && x.TargetItem != null && x.Equal).OrderBy(x => x.SourceItemName)); result.SameItems.AddRange(compareResultItems.DataTypes.Where(x => x.SourceItem != null && x.TargetItem != null && x.Equal).OrderBy(x => x.SourceItemName)); - this.logger.LogDebug($"Same items => {result.SameItems.Count}"); + this.logger.LogDebug("Same items => {Count}", result.SameItems.Count); } /// diff --git a/SQLSchemaCompare.Services/ProjectService.cs b/SQLSchemaCompare.Services/ProjectService.cs index cd14fd7..435ae88 100644 --- a/SQLSchemaCompare.Services/ProjectService.cs +++ b/SQLSchemaCompare.Services/ProjectService.cs @@ -106,7 +106,7 @@ public void LoadProject(string filename) } catch (Exception ex) { - this.logger.LogError($"Load project error: {ex}"); + this.logger.LogError(ex, "Error loading project from file: {Filename}", filename); throw; } } diff --git a/SQLSchemaCompare.Services/SQLSchemaCompare.Services.csproj b/SQLSchemaCompare.Services/SQLSchemaCompare.Services.csproj index fb44667..2e05e03 100644 --- a/SQLSchemaCompare.Services/SQLSchemaCompare.Services.csproj +++ b/SQLSchemaCompare.Services/SQLSchemaCompare.Services.csproj @@ -8,8 +8,8 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/SQLSchemaCompare.Services/packages.lock.json b/SQLSchemaCompare.Services/packages.lock.json index c50e338..914c0f0 100644 --- a/SQLSchemaCompare.Services/packages.lock.json +++ b/SQLSchemaCompare.Services/packages.lock.json @@ -14,20 +14,20 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Direct", - "requested": "[10.0.7, )", - "resolved": "10.0.7", - "contentHash": "tIEcQ2gvERrH2KiCjdsVcHGhXt9lIsuDStfOIeZWr7/fP8IXhGiYfx0/80PNI7WPO2IYuFtlZLSlnTS8+/Mchw==", + "requested": "[10.0.8, )", + "resolved": "10.0.8", + "contentHash": "fdVadZmsC8jRP0KvKy8mO8f6GV/HyBvElfcSxEhd+5FM5boAw/01iSaCto5G3G37ApJira4A3pNaVvBv8cUiLQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" } }, "Neolution.CodeAnalysis": { "type": "Direct", - "requested": "[3.2.2, )", - "resolved": "3.2.2", - "contentHash": "9eBWPh7DNlBje/vH1q5Z4Q5FjwahYavPE2NsJO78IRcQ0xDrhor2FY8DxLA26BsweMqn4Ej0cN5dnyFexjl+ww==", + "requested": "[3.3.0-beta.2, )", + "resolved": "3.3.0-beta.2", + "contentHash": "88mG4f4P16K4Ql3uTqeaoeXGJLNMReFh9z3ZKmKZ0bY4RTk4z4syjuF/TefouGM2hR+mcBSdWbAtsKT/+FowlA==", "dependencies": { - "SonarAnalyzer.CSharp": "9.20.0.85982", + "SonarAnalyzer.CSharp": "9.32.0.97167", "StyleCop.Analyzers.Unstable": "1.2.0.556" } }, @@ -39,8 +39,8 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "Z6mfFEaFcwCfSboxJwOLfu7/31npCY9q70WUamHW/vRQhDvBKOT4Vf9YkZj5J6hLvJpb0oDEYfHunQZj0xxvKw==" + "resolved": "10.0.8", + "contentHash": "21nbDV60SRPWGIivsyl6lqBeEJNG1sginhhfWgRrr3Ais7aQ12To25OAHQxgoiJkjqy1aQ6RxpZBGYuTi7Ge6A==" }, "Newtonsoft.Json.Bson": { "type": "Transitive", @@ -52,8 +52,8 @@ }, "SonarAnalyzer.CSharp": { "type": "Transitive", - "resolved": "9.20.0.85982", - "contentHash": "c0IYtFg4mYusTafTy0Bs5wev45vRKNShkuoWyQyPMbC6imEFHL7tY/7xbbUJd6JNLYx5vP8wyi2LgiBsMHqb2Q==" + "resolved": "9.32.0.97167", + "contentHash": "Yxk86RV+8ynJpUhku1Yw2hITFmnmXKkXJ73cIFSy85ol5SnWREQg9RuTyV8nI7V7+pyLKpCfRmD7P0widsgjkg==" }, "StyleCop.Analyzers.Unstable": { "type": "Transitive", diff --git a/SQLSchemaCompare.Test/Attributes/CategoryAttribute.cs b/SQLSchemaCompare.Test/Attributes/CategoryAttribute.cs new file mode 100644 index 0000000..cfa76b0 --- /dev/null +++ b/SQLSchemaCompare.Test/Attributes/CategoryAttribute.cs @@ -0,0 +1,14 @@ +namespace TiCodeX.SQLSchemaCompare.Test.Attributes; + +/// +/// The CategoryAttribute class is a custom attribute that can be applied to test methods or classes to indicate their category. +/// +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true)] +public class CategoryAttribute(string categoryName) : Attribute, ITraitAttribute +{ + /// + public IReadOnlyCollection> GetTraits() + { + return [new KeyValuePair("Category", categoryName)]; + } +} diff --git a/SQLSchemaCompare.Test/ExcelDataAttribute.cs b/SQLSchemaCompare.Test/Attributes/ExcelDataAttribute.cs similarity index 61% rename from SQLSchemaCompare.Test/ExcelDataAttribute.cs rename to SQLSchemaCompare.Test/Attributes/ExcelDataAttribute.cs index 7084727..ab2740f 100644 --- a/SQLSchemaCompare.Test/ExcelDataAttribute.cs +++ b/SQLSchemaCompare.Test/Attributes/ExcelDataAttribute.cs @@ -1,165 +1,169 @@ -namespace TiCodeX.SQLSchemaCompare.Test; - -using System.Reflection; -using OfficeOpenXml; -using Xunit.Sdk; - -/// -/// Provides an excel data source for a data theory -/// -/// -/// Initializes a new instance of the class. -/// -/// The path of the excel file -[AttributeUsage(AttributeTargets.Method, Inherited = false)] -public sealed class ExcelDataAttribute(string filePath) : DataAttribute -{ - /// - /// Gets the path of the excel file - /// - public string FilePath { get; } = filePath; - - /// - [SuppressMessage("Critical Code Smell", "S3776:Cognitive Complexity of methods should not be too high", Justification = "TODO")] - public override IEnumerable GetData(MethodInfo testMethod) - { - ArgumentNullException.ThrowIfNull(testMethod); - - return GetDataInternal(testMethod); - - IEnumerable GetDataInternal(MethodInfo testMethod) - { - // Get the absolute path to the file - var path = Path.IsPathRooted(this.FilePath) - ? this.FilePath - : Path.GetRelativePath(Directory.GetCurrentDirectory(), this.FilePath); - - if (!File.Exists(path)) - { - throw new ArgumentException($"Could not find file at path: {path}"); - } - - ExcelPackage.License.SetNonCommercialOrganization("TiCodeX"); - using var p = new ExcelPackage(new FileInfo(path)); - // Retrieve first Worksheet - var ws = p.Workbook.Worksheets.First(); - - // Read the first Row for the column names and place into a list so that - // it can be used as reference to properties - var columnNames = new Dictionary(); - var colPosition = 0; - foreach (var cell in ws.Cells[1, 1, 1, ws.Dimension.Columns]) - { - columnNames.Add(cell.Value.ToString().ToUpperInvariant(), colPosition++); - } - - // Loop through the rows of the excel sheet - for (var rowNum = 2; rowNum <= ws.Dimension.End.Row; rowNum++) - { - var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Cells.Count()]; - - var objArr = new List(); - foreach (var parameterInfo in testMethod.GetParameters()) - { - if (IsSimpleType(parameterInfo.ParameterType)) - { - if (!columnNames.TryGetValue( - $"{parameterInfo.Name}".ToUpperInvariant(), - out var position)) - { - throw new KeyNotFoundException($"Could not find column with header: {parameterInfo.Name}"); - } - - objArr.Add(ConvertParameter(parameterInfo.ParameterType, wsRow[rowNum, position + 1].Value)); - } - else - { - var obj = Activator.CreateInstance(parameterInfo.ParameterType); - objArr.Add(obj); - - this.RecursiveSetProperty(columnNames, wsRow, rowNum, parameterInfo.Name, obj); - } - } - - yield return objArr.ToArray(); - } - } - } - - /// - /// Convert the parameter - /// - /// The parameter type - /// The value - /// The converted parameter - private static object ConvertParameter(Type parameterType, object value) - { - var type = Nullable.GetUnderlyingType(parameterType) ?? parameterType; - var returnValue = value == null ? null : Convert.ChangeType(value, type, CultureInfo.InvariantCulture); - - // If it's a string, fix the new line characters - if (returnValue is string returnValueStr) - { - returnValue = returnValueStr.Replace("\n", Environment.NewLine, StringComparison.InvariantCulture); - } - - return returnValue; - } - - /// - /// Check whether the type is a simple type - /// - /// The type - /// True if it's a simple type; otherwise false - private static bool IsSimpleType(Type type) - { - return type.IsPrimitive || - new[] - { - typeof(Enum), - typeof(string), - typeof(decimal), - typeof(DateTime), - typeof(DateTimeOffset), - typeof(TimeSpan), - typeof(Guid), - }.Contains(type) || - Convert.GetTypeCode(type) != TypeCode.Object || - (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>) && IsSimpleType(type.GetGenericArguments()[0])); - } - - /// - /// Set the property recusively - /// - /// The column names - /// The worksheet row - /// The row number - /// The parameter prefix - /// The object - private void RecursiveSetProperty(IReadOnlyDictionary columnNames, ExcelRange wsRow, int rowNum, string parameterPrefix, object obj) - { - foreach (var propertyInfo in obj.GetType().GetProperties()) - { - // Check if there are columns in the excel related to this property, otherwise skip it - if (!IsSimpleType(propertyInfo.PropertyType) && columnNames.Keys.Any(x => x.StartsWith($"{parameterPrefix}.{propertyInfo.Name}".ToUpperInvariant(), StringComparison.Ordinal))) - { - // Since there are values, check if the object exists, otherwise create it - if (propertyInfo.GetValue(obj) == null) - { - propertyInfo.SetValue(obj, Activator.CreateInstance(propertyInfo.PropertyType)); - } - - this.RecursiveSetProperty(columnNames, wsRow, rowNum, $"{parameterPrefix}.{propertyInfo.Name}", propertyInfo.GetValue(obj)); - } - - if (!columnNames.TryGetValue( - $"{parameterPrefix}.{propertyInfo.Name}".ToUpperInvariant(), - out var position)) - { - continue; - } - - propertyInfo.SetValue(obj, ConvertParameter(propertyInfo.PropertyType, wsRow[rowNum, position + 1].Value)); - } - } -} +namespace TiCodeX.SQLSchemaCompare.Test.Attributes; + +using System.Reflection; +using OfficeOpenXml; + +/// +/// Provides an excel data source for a data theory +/// +/// +/// Initializes a new instance of the class. +/// +/// The path of the excel file +[AttributeUsage(AttributeTargets.Method, Inherited = false)] +public sealed class ExcelDataAttribute(string filePath) : DataAttribute +{ + /// + /// Gets the path of the excel file + /// + public string FilePath { get; } = filePath; + + /// + [SuppressMessage("Critical Code Smell", "S3776:Cognitive Complexity of methods should not be too high", Justification = "TODO")] + public override ValueTask> GetData(MethodInfo testMethod, DisposalTracker disposalTracker) + { + ArgumentNullException.ThrowIfNull(testMethod); + + var resultRows = new List(); + + // Get the absolute path to the file + var path = Path.IsPathRooted(this.FilePath) + ? this.FilePath + : Path.GetRelativePath(Directory.GetCurrentDirectory(), this.FilePath); + + if (!File.Exists(path)) + { + throw new ArgumentException($"Could not find file at path: {path}"); + } + + ExcelPackage.License.SetNonCommercialOrganization("TiCodeX"); + using var p = new ExcelPackage(new FileInfo(path)); + // Retrieve first Worksheet + var ws = p.Workbook.Worksheets.First(); + + // Read the first Row for the column names and place into a list so that + // it can be used as reference to properties + var columnNames = new Dictionary(); + var colPosition = 0; + foreach (var cell in ws.Cells[1, 1, 1, ws.Dimension.Columns]) + { + columnNames.Add(cell.Value.ToString().ToUpperInvariant(), colPosition++); + } + + // Loop through the rows of the excel sheet + for (var rowNum = 2; rowNum <= ws.Dimension.End.Row; rowNum++) + { + var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Cells.Count()]; + + var objArr = new List(); + foreach (var parameterInfo in testMethod.GetParameters()) + { + if (IsSimpleType(parameterInfo.ParameterType)) + { + if (!columnNames.TryGetValue( + $"{parameterInfo.Name}".ToUpperInvariant(), + out var position)) + { + throw new KeyNotFoundException($"Could not find column with header: {parameterInfo.Name}"); + } + + objArr.Add(ConvertParameter(parameterInfo.ParameterType, wsRow[rowNum, position + 1].Value)); + } + else + { + var obj = Activator.CreateInstance(parameterInfo.ParameterType); + objArr.Add(obj); + + this.RecursiveSetProperty(columnNames, wsRow, rowNum, parameterInfo.Name, obj); + } + } + + resultRows.Add(new TheoryDataRow([.. objArr])); + } + + return ValueTask.FromResult>(resultRows); + } + + /// + public override bool SupportsDiscoveryEnumeration() + { + return false; + } + + /// + /// Convert the parameter + /// + /// The parameter type + /// The value + /// The converted parameter + private static object ConvertParameter(Type parameterType, object value) + { + var type = Nullable.GetUnderlyingType(parameterType) ?? parameterType; + var returnValue = value == null ? null : Convert.ChangeType(value, type, CultureInfo.InvariantCulture); + + // If it's a string, fix the new line characters + if (returnValue is string returnValueStr) + { + returnValue = returnValueStr.Replace("\n", Environment.NewLine, StringComparison.InvariantCulture); + } + + return returnValue; + } + + /// + /// Check whether the type is a simple type + /// + /// The type + /// True if it's a simple type; otherwise false + private static bool IsSimpleType(Type type) + { + return type.IsPrimitive || + new[] + { + typeof(Enum), + typeof(string), + typeof(decimal), + typeof(DateTime), + typeof(DateTimeOffset), + typeof(TimeSpan), + typeof(Guid), + }.Contains(type) || + Convert.GetTypeCode(type) != TypeCode.Object || + (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>) && IsSimpleType(type.GetGenericArguments()[0])); + } + + /// + /// Set the property recusively + /// + /// The column names + /// The worksheet row + /// The row number + /// The parameter prefix + /// The object + private void RecursiveSetProperty(IReadOnlyDictionary columnNames, ExcelRange wsRow, int rowNum, string parameterPrefix, object obj) + { + foreach (var propertyInfo in obj.GetType().GetProperties()) + { + // Check if there are columns in the excel related to this property, otherwise skip it + if (!IsSimpleType(propertyInfo.PropertyType) && columnNames.Keys.Any(x => x.StartsWith($"{parameterPrefix}.{propertyInfo.Name}".ToUpperInvariant(), StringComparison.Ordinal))) + { + // Since there are values, check if the object exists, otherwise create it + if (propertyInfo.GetValue(obj) == null) + { + propertyInfo.SetValue(obj, Activator.CreateInstance(propertyInfo.PropertyType)); + } + + this.RecursiveSetProperty(columnNames, wsRow, rowNum, $"{parameterPrefix}.{propertyInfo.Name}", propertyInfo.GetValue(obj)); + } + + if (!columnNames.TryGetValue( + $"{parameterPrefix}.{propertyInfo.Name}".ToUpperInvariant(), + out var position)) + { + continue; + } + + propertyInfo.SetValue(obj, ConvertParameter(propertyInfo.PropertyType, wsRow[rowNum, position + 1].Value)); + } + } +} diff --git a/SQLSchemaCompare.Test/Attributes/IntegrationTestAttribute.cs b/SQLSchemaCompare.Test/Attributes/IntegrationTestAttribute.cs new file mode 100644 index 0000000..c439139 --- /dev/null +++ b/SQLSchemaCompare.Test/Attributes/IntegrationTestAttribute.cs @@ -0,0 +1,14 @@ +namespace TiCodeX.SQLSchemaCompare.Test.Attributes; + +/// +/// The IntegrationTestAttribute class is a custom attribute that can be applied to test methods or classes to indicate that they are integration tests. +/// +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true)] +public class IntegrationTestAttribute : Attribute, ITraitAttribute +{ + /// + public IReadOnlyCollection> GetTraits() + { + return [new KeyValuePair("Category", "IntegrationTest")]; + } +} diff --git a/SQLSchemaCompare.Test/Attributes/UnitTestAttribute.cs b/SQLSchemaCompare.Test/Attributes/UnitTestAttribute.cs new file mode 100644 index 0000000..fca9f67 --- /dev/null +++ b/SQLSchemaCompare.Test/Attributes/UnitTestAttribute.cs @@ -0,0 +1,14 @@ +namespace TiCodeX.SQLSchemaCompare.Test.Attributes; + +/// +/// The UnitTestAttribute class is a custom attribute that can be applied to test methods or classes to indicate that they are unit tests. +/// +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true)] +public class UnitTestAttribute : Attribute, ITraitAttribute +{ + /// + public IReadOnlyCollection> GetTraits() + { + return [new KeyValuePair("Category", "UnitTest")]; + } +} diff --git a/SQLSchemaCompare.Test/SQLSchemaCompare.Test.csproj b/SQLSchemaCompare.Test/SQLSchemaCompare.Test.csproj index 161bb4c..a973897 100644 --- a/SQLSchemaCompare.Test/SQLSchemaCompare.Test.csproj +++ b/SQLSchemaCompare.Test/SQLSchemaCompare.Test.csproj @@ -1,7 +1,8 @@ - + TiCodeX.SQLSchemaCompare.Test TiCodeX.SQLSchemaCompare.Test + Exe false @@ -9,29 +10,26 @@ - - + + - - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - all runtime; build; native; contentfiles; analyzers - + diff --git a/SQLSchemaCompare.Test/packages.lock.json b/SQLSchemaCompare.Test/packages.lock.json index 6915082..d2b6165 100644 --- a/SQLSchemaCompare.Test/packages.lock.json +++ b/SQLSchemaCompare.Test/packages.lock.json @@ -28,17 +28,6 @@ "resolved": "8.10.0", "contentHash": "yGvv+xp0gHFgGwhQcGoDdKIrhLhPi3zYYWWLLHPMctr+G6PWD7QH8L4wqoa5WRZquPbfSV/cP1MraI7ppAHrWw==" }, - "Microsoft.AspNetCore.Mvc.Testing": { - "type": "Direct", - "requested": "[10.0.7, )", - "resolved": "10.0.7", - "contentHash": "lWyzApi1g8/r0eXqZBbl5bA8zewS8koxOir83/+OvJcyn2HazdUzPFd4MWc9uMdVzCRX6Z5aY4tNK+N0pWXMLg==", - "dependencies": { - "Microsoft.AspNetCore.TestHost": "10.0.7", - "Microsoft.Extensions.DependencyModel": "10.0.7", - "Microsoft.Extensions.Hosting": "10.0.7" - } - }, "Microsoft.NET.Test.Sdk": { "type": "Direct", "requested": "[18.5.1, )", @@ -60,40 +49,29 @@ }, "Neolution.CodeAnalysis.TestsRuleset": { "type": "Direct", - "requested": "[3.2.2, )", - "resolved": "3.2.2", - "contentHash": "aPoC5BjdvFAc9z8pezdlfu0eChTnBShSY9sl+sEIIfLJS5mgWqtbNz6WPZwZhmlg/ypxwaqmBf2t1LLz4l6FiA==", + "requested": "[3.3.0-beta.2, )", + "resolved": "3.3.0-beta.2", + "contentHash": "GQXIkpfRlgKFZw+vsQM2wTqRVq10Sq/zcEniQgFGTNZqyBCzogBLzi8FabptRO38yblVPN7YS35IqQ3bJtfp1Q==", "dependencies": { - "SonarAnalyzer.CSharp": "9.20.0.85982", + "SonarAnalyzer.CSharp": "9.32.0.97167", "StyleCop.Analyzers.Unstable": "1.2.0.556" } }, - "xunit": { - "type": "Direct", - "requested": "[2.9.3, )", - "resolved": "2.9.3", - "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", - "dependencies": { - "xunit.analyzers": "1.18.0", - "xunit.assert": "2.9.3", - "xunit.core": "[2.9.3]" - } - }, - "xunit.categories": { - "type": "Direct", - "requested": "[3.0.1, )", - "resolved": "3.0.1", - "contentHash": "je4ogEoneIl21pqiGPPF1iWFUP1UKV+//clBmBpJikZXapcoUH6CjEu1YOVSGkmfrpg1wWxmlXew2wfAkqOuGQ==", - "dependencies": { - "xunit.core": "2.4.1" - } - }, "xunit.runner.visualstudio": { "type": "Direct", "requested": "[3.1.5, )", "resolved": "3.1.5", "contentHash": "tKi7dSTwP4m5m9eXPM2Ime4Kn7xNf4x4zT9sdLO/G4hZVnQCRiMTWoSZqI/pYTVeI27oPPqHBKYI/DjJ9GsYgA==" }, + "xunit.v3": { + "type": "Direct", + "requested": "[3.2.2, )", + "resolved": "3.2.2", + "contentHash": "L+4/4y0Uqcg8/d6hfnxhnwh4j9FaeULvefTwrk30rr1o4n/vdPfyUQ8k0yzH8VJx7bmFEkDdcRfbtbjEHlaYcA==", + "dependencies": { + "xunit.v3.mtp-v1": "[3.2.2]" + } + }, "Azure.Core": { "type": "Transitive", "resolved": "1.47.1", @@ -127,6 +105,11 @@ "resolved": "8.4.0", "contentHash": "QaEzDFG2vcQMPqUmoWv0vBTObtH8hffQmyDr2WkqRYF/nFSn2pkdBB4vudcd/EIv0N8M3P1fzzkPQgEWsFnUmA==" }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, "Microsoft.AspNet.WebApi.Client": { "type": "Transitive", "resolved": "6.0.0", @@ -136,11 +119,6 @@ "Newtonsoft.Json.Bson": "1.0.2" } }, - "Microsoft.AspNetCore.TestHost": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "2UM9EtTmX6yF6Efa6WOO7wmHz2kPksmnzPmMwveuOGJQwbtNg5wKGj7usGLr8Ve3AMhIAc2yqyRXt1xNsed3hg==" - }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", "resolved": "8.0.0", @@ -180,66 +158,66 @@ }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "G6yclVO5/csPzzsymV0SemY2NDqE31CP5M3jprF5IuO9wJsh4aUOfYD8HCLuDmM1D1CfReegVic48O2r79d46Q==", + "resolved": "10.0.8", + "contentHash": "EJx+fIBMgBlgD+ublKCn+GTOJkw3UqV7xOjYWBRVdUYyIm8UfvAsmSOPFiIInsWTHyMEYUJ9gCJY1jwX+6UB7w==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "10.0.7", - "Microsoft.EntityFrameworkCore.Analyzers": "10.0.7", - "Microsoft.Extensions.Caching.Memory": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7" + "Microsoft.EntityFrameworkCore.Abstractions": "10.0.8", + "Microsoft.EntityFrameworkCore.Analyzers": "10.0.8", + "Microsoft.Extensions.Caching.Memory": "10.0.8", + "Microsoft.Extensions.Logging": "10.0.8" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "TuxExnfIS/bSq3z2CbH0LwZH1oyj9iHhSGneU4fpxl3ikjZGZdSae9gcfnImV1rufH8f/ab1NnHwyL2BLyeZOg==" + "resolved": "10.0.8", + "contentHash": "jbKDXWPZQhuPHygMnwzNOqxBADVcpRVytcKYZsA++QqhPkpF93Ta8o5mbJQGrARSjlkr9WtOaADV97EDMOZ7DA==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "eZnMyiJzo249Ejg5CaFScvJS0u7neQfS9DXknAHTO6FHVMM99gO0byNXHGZmA/BOkZ13ngeVziQLHTMOtgescg==" + "resolved": "10.0.8", + "contentHash": "M3BZ8JH8rB6BE7dO2g9iVbrHLnEz9wMXT6q+tDR6Nq3gyP3KmBj5OTiZGxyF3vesjOQNKanYoPGSNBR4kR2llg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "midwPufIwXhOJcVhaZpCZGNbjy2QoPfHI+70nw2dGcoULEW9DybMvMPYkRjOJV0eI46a1oVFhU4lFYDEx6YUbg==", + "resolved": "10.0.8", + "contentHash": "UU3diAD2wwZveye2rnrwaF/wvJ9tm5iL2fuY9TTap6/iGQK1OO29M1BzXZRlRPVH/dByt5w/pISBSFtyR7hTqw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "10.0.7", - "Microsoft.Extensions.Caching.Memory": "10.0.7", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7" + "Microsoft.EntityFrameworkCore": "10.0.8", + "Microsoft.Extensions.Caching.Memory": "10.0.8", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", + "Microsoft.Extensions.Logging": "10.0.8" } }, "Microsoft.EntityFrameworkCore.SqlServer": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "jci/dpjLIZyrp0Kbt0kr1lh+7BXbJ3wNk+vTwS/Se65grEJSBC+eE2UAQsi/xSNB5lHP2dysyOMHugkpFwQwNA==", + "resolved": "10.0.8", + "contentHash": "A+FLIsTH9l5DG2iD6QW6Mfwlvr+BjWme/jJ2hvwmmENTr7lR1UWmgCtKCjDYcHxqdAD15bb4PgQnSzw12DV/pw==", "dependencies": { "Microsoft.Data.SqlClient": "6.1.1", - "Microsoft.EntityFrameworkCore.Relational": "10.0.7", - "Microsoft.Extensions.Caching.Memory": "10.0.7", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7" + "Microsoft.EntityFrameworkCore.Relational": "10.0.8", + "Microsoft.Extensions.Caching.Memory": "10.0.8", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", + "Microsoft.Extensions.Logging": "10.0.8" } }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "pUDgQKEqNUFlerDIFRg7zzoDVRPEWIG7nR40h8Gzg8RXza4Ry0lWZ7u91bmwu3iUDCxw3Dv6TLHVFoAgY0gy7Q==", + "resolved": "10.0.8", + "contentHash": "EoK2TwVR1daxmfXUPnvIYZSk5XQjHe45sGekox4kvMt88KQZQhDVzYW5Na5+oNwTuRpE48hipyGJg12F1Tm70w==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.7" + "Microsoft.Extensions.Primitives": "10.0.8" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "6eULH/sc97yfCEV31g7AgUzHc7dIm0DGBcofoE8GgBaXbdAPPhathN8rYcgi1TSiG1QucCdqKiVNaDEPAEXL5Q==", + "resolved": "10.0.8", + "contentHash": "sYMYQjNprfqPTryuLNnr0/AOtnhlfuZ0ZxyOV0d3AXOEL8j9KV0EbelpZYyIatT2hJiaSGO9XGr5YDRsh22OfQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "10.0.7", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging.Abstractions": "10.0.7", - "Microsoft.Extensions.Options": "10.0.7", - "Microsoft.Extensions.Primitives": "10.0.7" + "Microsoft.Extensions.Caching.Abstractions": "10.0.8", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", + "Microsoft.Extensions.Logging.Abstractions": "10.0.8", + "Microsoft.Extensions.Options": "10.0.8", + "Microsoft.Extensions.Primitives": "10.0.8" } }, "Microsoft.Extensions.Configuration": { @@ -253,37 +231,10 @@ }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "t56nEgvECcyLPojZIUFWJknQQDAbgfTf9J+QMYJE1YYvVgz69vN6B/AKL8Grvj3Lcnp8kTpNqwmwFhb3YLJmtQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.7" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "8bS1qIaRivny+WX+49pmeJ6iAylbtX8C0DLEcCQWZjdxQvLqaMssXiGD9P/6pYElrHbK5/nAHmjbQ8STqdMYeg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.7", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" - } - }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "3lNjglxfFxOzI9zG+3HSg/YSGqo//8Fqw6u6iuIamZb4JCorbA3JLaeWOpfKTAPi2UJwaispOXWx14dUqcGz4A==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.7", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "TWto3imA+mJMLZI+5sbgLiFFoOFNFkizQYNaC5jTuiHKn3diwm1RN7mWDOEZN9kG2bixw7IvgpvtUG5/teSRzA==", + "resolved": "10.0.8", + "contentHash": "I63esIFbL3h5pSt7gXpXOlmcwDmYBUoYNEglKfDPFUqtYvSV84f2l28hO2lfVXsV0wdlplgAM7IVz16matapSg==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.7", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" + "Microsoft.Extensions.Primitives": "10.0.8" } }, "Microsoft.Extensions.Configuration.FileExtensions": { @@ -309,53 +260,18 @@ "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7" } }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "YqVIICoIdl0016wkeO2WQS+uEbEXbUhMLKdC5rZNl1X3nu59F+nwaAHdHjq/4OK+Cx31DYmNUSFh+MUot8qSDw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", - "Microsoft.Extensions.Configuration.Json": "10.0.7", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", - "Microsoft.Extensions.FileProviders.Physical": "10.0.7" - } - }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "91F/o3emPV/+xY/ip3s2LqDNF14kjttlVtq0BXgg6p4MnCzeSZxnUJm+t6WRrtD3JdGo88/oX+z7OwK4y8PZuw==", + "resolved": "10.0.8", + "contentHash": "daf62xHIrq8pnE709hgaZZN9tSam9TGGepWe1+bE6V3GEuVwJiMs6ib+38lfMCyAJAHiX0vapxBhsuMSV7U+cg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "Z6mfFEaFcwCfSboxJwOLfu7/31npCY9q70WUamHW/vRQhDvBKOT4Vf9YkZj5J6hLvJpb0oDEYfHunQZj0xxvKw==" - }, - "Microsoft.Extensions.DependencyModel": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "gCglFg/9Chu3lyJNytRuQAYM3mXQKNs1i01Cz2bc545QaHQ+LbBb4O5UCfu968Gro3ZVSOZ/ktilmPcaUSGSZA==" - }, - "Microsoft.Extensions.Diagnostics": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "l+smp1qPlU0OUXD0OGfdp7OUFrbdq7ZaP5T7m2WpfZ4RFKD7iG73BAT7tjSMxNmbSXkhAn1jYHOAqzYG1r9sNg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.7", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.7", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.7" - } - }, - "Microsoft.Extensions.Diagnostics.Abstractions": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "uJ9JP677y+uy+C0vtaSfi7XXgFAdz8DhU3M9lwwIXDfQKcyQ0yxM9DVYa0NXDtdVTYA2eBUtVFZ8LY0GCdeE/w==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Options": "10.0.7" - } + "resolved": "10.0.8", + "contentHash": "21nbDV60SRPWGIivsyl6lqBeEJNG1sginhhfWgRrr3Ais7aQ12To25OAHQxgoiJkjqy1aQ6RxpZBGYuTi7Ge6A==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", @@ -380,151 +296,37 @@ "resolved": "10.0.7", "contentHash": "NTUspqB+vH9g4wAD6KPOBx01xqYuKXR/cHXm449zpbq1GqfjdAxBmg7eJXrNsPw7SKwIdT2cJ05GxYVvc+lvsA==" }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "M/vBpfWcschvS2EUeq7cHfscsxabiGTptXwV7GeSueovGiSoNjyo1j5PMcWuOAAQrRW3nRqxZk8NeumrmpzUBg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.7", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", - "Microsoft.Extensions.Configuration.Binder": "10.0.7", - "Microsoft.Extensions.Configuration.CommandLine": "10.0.7", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "10.0.7", - "Microsoft.Extensions.Configuration.FileExtensions": "10.0.7", - "Microsoft.Extensions.Configuration.Json": "10.0.7", - "Microsoft.Extensions.Configuration.UserSecrets": "10.0.7", - "Microsoft.Extensions.DependencyInjection": "10.0.7", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Diagnostics": "10.0.7", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", - "Microsoft.Extensions.FileProviders.Physical": "10.0.7", - "Microsoft.Extensions.Hosting.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7", - "Microsoft.Extensions.Logging.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging.Configuration": "10.0.7", - "Microsoft.Extensions.Logging.Console": "10.0.7", - "Microsoft.Extensions.Logging.Debug": "10.0.7", - "Microsoft.Extensions.Logging.EventLog": "10.0.7", - "Microsoft.Extensions.Logging.EventSource": "10.0.7", - "Microsoft.Extensions.Options": "10.0.7" - } - }, - "Microsoft.Extensions.Hosting.Abstractions": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "5s8d6qC6EA8UOI4wR/+zlsq7SXttJMRb9d7zvVZ7+bE3CQEfVtC9ITUDCommm87R1zzj6WJBbCnztuIJXnP3DA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.7", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging.Abstractions": "10.0.7" - } - }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "hOeRIQ63GkgiYCB/MIFp+LQs8aXpJXpB55t6Aj37ab7t2/6WeFcPXxYM9hdy/o5tffzwf8mhqzLJP6mjGYCxjw==", + "resolved": "10.0.8", + "contentHash": "K60JhWC2hN/Gi7TP68tBxSzk5ACWOs7lkmPzsfA8Bcf/IXTajujt2ORMf9rSMk1bsng6Lv4Y3fuxp3bm1+15ug==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.7", - "Microsoft.Extensions.Logging.Abstractions": "10.0.7", - "Microsoft.Extensions.Options": "10.0.7" + "Microsoft.Extensions.DependencyInjection": "10.0.8", + "Microsoft.Extensions.Logging.Abstractions": "10.0.8", + "Microsoft.Extensions.Options": "10.0.8" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "tIEcQ2gvERrH2KiCjdsVcHGhXt9lIsuDStfOIeZWr7/fP8IXhGiYfx0/80PNI7WPO2IYuFtlZLSlnTS8+/Mchw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "7BBnoGF37USiu7j434put9mDp7EjdlNDIZsR4vHfC1FbLZeLqiWjgJbeEtF0p59Ryqt8AtraHawf0ZKbe5jibg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.7", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", - "Microsoft.Extensions.Configuration.Binder": "10.0.7", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7", - "Microsoft.Extensions.Logging.Abstractions": "10.0.7", - "Microsoft.Extensions.Options": "10.0.7", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.7" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "DA++Es6v6W0HfrOrw+K8WyN6jNnZHp640PDdEvl8yfeVmgflKdn6vSSFvufNUSOuY+M2ZaSUgfY+jUKtNpXcCw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7", - "Microsoft.Extensions.Logging.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging.Configuration": "10.0.7", - "Microsoft.Extensions.Options": "10.0.7" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "Y6DSt/JZApunYWKqTtqbdsR6iqAvHx3D0tavbNJ1rnC24MUpF+3XO/VKgFi+9PFqMyvQ2GHBBGb8H3cLSw7rDg==", + "resolved": "10.0.8", + "contentHash": "fdVadZmsC8jRP0KvKy8mO8f6GV/HyBvElfcSxEhd+5FM5boAw/01iSaCto5G3G37ApJira4A3pNaVvBv8cUiLQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7", - "Microsoft.Extensions.Logging.Abstractions": "10.0.7" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "1C8eTuxF6BLncNSJ1HCfmaBcjpUSqQDPlBVdYTlet9oldHTPpNh9iatxSJLs8TOqdp/FOpH+nSLdBve7fu9mTQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7", - "Microsoft.Extensions.Logging.Abstractions": "10.0.7", - "Microsoft.Extensions.Options": "10.0.7", - "System.Diagnostics.EventLog": "10.0.7" - } - }, - "Microsoft.Extensions.Logging.EventSource": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "YWfndnDX1jVMGCN8d5T+rO+BO8sDw6BkYlUk0BYui+WP7+HhlWx8QLdA4yUDjrkGVb3AQxIWWEPVKw5Nnfj5GQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Logging": "10.0.7", - "Microsoft.Extensions.Logging.Abstractions": "10.0.7", - "Microsoft.Extensions.Options": "10.0.7", - "Microsoft.Extensions.Primitives": "10.0.7" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "00SHUGTh2jSMvIr6x9Xwd2nE+B5/qFCO/9hDwUDhJsjYRDlADmaBZ7tqehXzBDsfjHSXJzuRHJzPYPPjphBQ7Q==", + "resolved": "10.0.8", + "contentHash": "VBD+131DpTNCNDfA4kIyKTiCySvJGNhwibdWBSdFRu7GMfXLXcXODkgA+KStKbbhzraLglZWUN4nXyHgW4JIRA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Primitives": "10.0.7" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "IT7f+EMXZtkjatEcF+o6aOw/7OE4etRrMiDGEWH/iiTu2R3uhC4NEQJCfHiibtX45U3sIQ5Fh6tbb1qaOz3YAg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", - "Microsoft.Extensions.Configuration.Binder": "10.0.7", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", - "Microsoft.Extensions.Options": "10.0.7", - "Microsoft.Extensions.Primitives": "10.0.7" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", + "Microsoft.Extensions.Primitives": "10.0.8" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "D5M0Jr551iTgwkZMN9rm0pSkgNLj5quUWQUmQPMZh7k/bnvZTnXRGfE2KuvXf1EEjt/ofD9yw9IumpgdP9QCnw==" + "resolved": "10.0.8", + "contentHash": "OBPo4nYhMyIbtueoC10CBm6AGAbo/A9IV8QQ/6ryZS7VvmqpGT7hunazeHLxFawRzn3oLOq4jhqhpBX4tfswWQ==" }, "Microsoft.Identity.Client": { "type": "Transitive", @@ -599,6 +401,36 @@ "resolved": "1.0.0", "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "1.9.1", + "contentHash": "No5AudZMmSb+uNXjlgL2y3/stHD2IT4uxqc5yHwkE+/nNux9jbKcaJMvcp9SwgP4DVD8L9/P3OUz8mmmcvEIdQ==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "1.9.1" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "1.9.1", + "contentHash": "AL46Xe1WBi85Ntd4mNPvat5ZSsZ2uejiVqoKCypr8J3wK0elA5xJ3AN4G/Q4GIwzUFnggZoH/DBjnr9J18IO/g==", + "dependencies": { + "Microsoft.Testing.Platform": "1.9.1" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "1.9.1", + "contentHash": "QafNtNSmEI0zazdebnsIkDKmFtTSpmx/5PLOjURWwozcPb3tvRxzosQSL8xwYNM1iPhhKiBksXZyRSE2COisrA==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "1.9.1", + "contentHash": "oTUtyR4X/s9ytuiNA29FGsNCCH0rNmY5Wdm14NCKLjTM1cT9edVSlA+rGS/mVmusPqcP0l/x9qOnMXg16v87RQ==", + "dependencies": { + "Microsoft.Testing.Platform": "1.9.1" + } + }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "18.5.1", @@ -613,12 +445,17 @@ "Newtonsoft.Json": "13.0.3" } }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, "Microting.EntityFrameworkCore.MySql": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "FNohIzR0HuCsGNc8kHDeICt3cReGCGO0mZ5SOzcTlmZZgZux7GN/ekBcjGb2LwT81wJIi0R5Xh1xZrPXvF7m9A==", + "resolved": "10.0.8", + "contentHash": "vaxt+8dU7WODnxl5/2k4VH+LNgbQHk+yGIqWum619+6lICCmbLHyYyzqgJRGzic+Aeyh212TeH5fHklfXAjWVw==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "[10.0.7, 10.0.999]", + "Microsoft.EntityFrameworkCore.Relational": "[10.0.8, 10.0.999]", "MySqlConnector": "2.5.0" } }, @@ -664,8 +501,8 @@ }, "SonarAnalyzer.CSharp": { "type": "Transitive", - "resolved": "9.20.0.85982", - "contentHash": "c0IYtFg4mYusTafTy0Bs5wev45vRKNShkuoWyQyPMbC6imEFHL7tY/7xbbUJd6JNLYx5vP8wyi2LgiBsMHqb2Q==" + "resolved": "9.32.0.97167", + "contentHash": "Yxk86RV+8ynJpUhku1Yw2hITFmnmXKkXJ73cIFSy85ol5SnWREQg9RuTyV8nI7V7+pyLKpCfRmD7P0widsgjkg==" }, "StyleCop.Analyzers.Unstable": { "type": "Transitive", @@ -697,8 +534,8 @@ }, "System.Diagnostics.EventLog": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ==" + "resolved": "9.0.4", + "contentHash": "getRQEXD8idlpb1KW56XuxImMy0FKp2WJPDf3Qr0kI/QKxxJSftqfDFVo0DZ3HCJRLU73qHSruv5q2l5O47jQQ==" }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", @@ -732,44 +569,71 @@ "System.Security.Cryptography.Pkcs": "10.0.7" } }, - "xunit.abstractions": { + "xunit.analyzers": { "type": "Transitive", - "resolved": "2.0.3", - "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + "resolved": "1.27.0", + "contentHash": "y/pxIQaLvk/kxAoDkZW9GnHLCEqzwl5TW0vtX3pweyQpjizB9y3DXhb9pkw2dGeUqhLjsxvvJM1k89JowU6z3g==" }, - "xunit.analyzers": { + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "BPciBghgEEaJN/JG00QfCYDfEfnLgQhfnYEy+j1izoeHVNYd5+3Wm8GJ6JgYysOhpBPYGE+sbf75JtrRc7jrdA==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "Hj775PEH6GTbbg0wfKRvG2hNspDCvTH9irXhH4qIWgdrOSV1sQlqPie+DOvFeigsFg2fxSM3ZAaaCDQs+KreFA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core.mtp-v1": { "type": "Transitive", - "resolved": "1.18.0", - "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ==" + "resolved": "3.2.2", + "contentHash": "Ga5aA2Ca9ktz+5k3g5ukzwfexwoqwDUpV6z7atSEUvqtd6JuybU1XopHqg1oFd78QdTfZgZE9h5sHpO4qYIi5w==", + "dependencies": { + "Microsoft.Testing.Extensions.Telemetry": "1.9.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.9.1", + "Microsoft.Testing.Platform": "1.9.1", + "Microsoft.Testing.Platform.MSBuild": "1.9.1", + "xunit.v3.extensibility.core": "[3.2.2]", + "xunit.v3.runner.inproc.console": "[3.2.2]" + } }, - "xunit.assert": { + "xunit.v3.extensibility.core": { "type": "Transitive", - "resolved": "2.9.3", - "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA==" + "resolved": "3.2.2", + "contentHash": "srY8z/oMPvh/t8axtO2DwrHajhFMH7tnqKildvYrVQIfICi8fOn3yIBWkVPAcrKmHMwvXRJ/XsQM3VMR6DOYfQ==", + "dependencies": { + "xunit.v3.common": "[3.2.2]" + } }, - "xunit.core": { + "xunit.v3.mtp-v1": { "type": "Transitive", - "resolved": "2.9.3", - "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==", + "resolved": "3.2.2", + "contentHash": "O41aAzYKBT5PWqATa1oEWVNCyEUypFQ4va6K0kz37dduV3EKzXNMaV2UnEhufzU4Cce1I33gg0oldS8tGL5I0A==", "dependencies": { - "xunit.extensibility.core": "[2.9.3]", - "xunit.extensibility.execution": "[2.9.3]" + "xunit.analyzers": "1.27.0", + "xunit.v3.assert": "[3.2.2]", + "xunit.v3.core.mtp-v1": "[3.2.2]" } }, - "xunit.extensibility.core": { + "xunit.v3.runner.common": { "type": "Transitive", - "resolved": "2.9.3", - "contentHash": "kf3si0YTn2a8J8eZNb+zFpwfoyvIrQ7ivNk5ZYA5yuYk1bEtMe4DxJ2CF/qsRgmEnDr7MnW1mxylBaHTZ4qErA==", + "resolved": "3.2.2", + "contentHash": "/hkHkQCzGrugelOAehprm7RIWdsUFVmIVaD6jDH/8DNGCymTlKKPTbGokD5czbAfqfex47mBP0sb0zbHYwrO/g==", "dependencies": { - "xunit.abstractions": "2.0.3" + "Microsoft.Win32.Registry": "[5.0.0]", + "xunit.v3.common": "[3.2.2]" } }, - "xunit.extensibility.execution": { + "xunit.v3.runner.inproc.console": { "type": "Transitive", - "resolved": "2.9.3", - "contentHash": "yMb6vMESlSrE3Wfj7V6cjQ3S4TXdXpRqYeNEI3zsX31uTsGMJjEw6oD5F5u1cHnMptjhEECnmZSsPxB6ChZHDQ==", + "resolved": "3.2.2", + "contentHash": "ulWOdSvCk+bPXijJZ73bth9NyoOHsAs1ZOvamYbCkD4DNLX/Bd29Ve2ZNUwBbK0MqfIYWXHZViy/HKrdEC/izw==", "dependencies": { - "xunit.extensibility.core": "[2.9.3]" + "xunit.v3.extensibility.core": "[3.2.2]", + "xunit.v3.runner.common": "[3.2.2]" } }, "TiCodeX.SQLSchemaCompare.Core": { @@ -781,9 +645,9 @@ "TiCodeX.SQLSchemaCompare.Infrastructure": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "[10.0.7, )", - "Microsoft.EntityFrameworkCore.SqlServer": "[10.0.7, )", - "Microting.EntityFrameworkCore.MySql": "[10.0.7, )", + "Microsoft.EntityFrameworkCore.Relational": "[10.0.8, )", + "Microsoft.EntityFrameworkCore.SqlServer": "[10.0.8, )", + "Microting.EntityFrameworkCore.MySql": "[10.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "[10.0.1, )", "TiCodeX.SQLSchemaCompare.Services": "[2026.5.1, )" } @@ -792,7 +656,7 @@ "type": "Project", "dependencies": { "Microsoft.AspNet.WebApi.Client": "[6.0.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.7, )", + "Microsoft.Extensions.Logging.Abstractions": "[10.0.8, )", "Newtonsoft.Json": "[13.0.4, )", "TiCodeX.SQLSchemaCompare.Core": "[2026.5.1, )" } @@ -821,10 +685,15 @@ "resolved": "6.0.2", "contentHash": "f+pRODTWX7Y67jXO3T5S2dIPZ9qMJNySjlZT/TKmWVNWe19N8jcWmHaqHnnchaq3gxEKv1SWVY5EFzOD06l41w==" }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, "System.Diagnostics.EventLog": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ==" + "resolved": "9.0.4", + "contentHash": "getRQEXD8idlpb1KW56XuxImMy0FKp2WJPDf3Qr0kI/QKxxJSftqfDFVo0DZ3HCJRLU73qHSruv5q2l5O47jQQ==" }, "System.Security.Cryptography.Pkcs": { "type": "Transitive", @@ -855,10 +724,15 @@ "resolved": "6.0.2", "contentHash": "f+pRODTWX7Y67jXO3T5S2dIPZ9qMJNySjlZT/TKmWVNWe19N8jcWmHaqHnnchaq3gxEKv1SWVY5EFzOD06l41w==" }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, "System.Diagnostics.EventLog": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ==" + "resolved": "9.0.4", + "contentHash": "getRQEXD8idlpb1KW56XuxImMy0FKp2WJPDf3Qr0kI/QKxxJSftqfDFVo0DZ3HCJRLU73qHSruv5q2l5O47jQQ==" }, "System.Security.Cryptography.Pkcs": { "type": "Transitive", @@ -889,10 +763,15 @@ "resolved": "6.0.2", "contentHash": "f+pRODTWX7Y67jXO3T5S2dIPZ9qMJNySjlZT/TKmWVNWe19N8jcWmHaqHnnchaq3gxEKv1SWVY5EFzOD06l41w==" }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, "System.Diagnostics.EventLog": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ==" + "resolved": "9.0.4", + "contentHash": "getRQEXD8idlpb1KW56XuxImMy0FKp2WJPDf3Qr0kI/QKxxJSftqfDFVo0DZ3HCJRLU73qHSruv5q2l5O47jQQ==" }, "System.Security.Cryptography.Pkcs": { "type": "Transitive", @@ -923,10 +802,15 @@ "resolved": "6.0.2", "contentHash": "f+pRODTWX7Y67jXO3T5S2dIPZ9qMJNySjlZT/TKmWVNWe19N8jcWmHaqHnnchaq3gxEKv1SWVY5EFzOD06l41w==" }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, "System.Diagnostics.EventLog": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ==" + "resolved": "9.0.4", + "contentHash": "getRQEXD8idlpb1KW56XuxImMy0FKp2WJPDf3Qr0kI/QKxxJSftqfDFVo0DZ3HCJRLU73qHSruv5q2l5O47jQQ==" }, "System.Security.Cryptography.Pkcs": { "type": "Transitive", @@ -957,10 +841,15 @@ "resolved": "6.0.2", "contentHash": "f+pRODTWX7Y67jXO3T5S2dIPZ9qMJNySjlZT/TKmWVNWe19N8jcWmHaqHnnchaq3gxEKv1SWVY5EFzOD06l41w==" }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, "System.Diagnostics.EventLog": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ==" + "resolved": "9.0.4", + "contentHash": "getRQEXD8idlpb1KW56XuxImMy0FKp2WJPDf3Qr0kI/QKxxJSftqfDFVo0DZ3HCJRLU73qHSruv5q2l5O47jQQ==" }, "System.Security.Cryptography.Pkcs": { "type": "Transitive", diff --git a/SQLSchemaCompare.UI/Middlewares/RequestValidatorMiddleware.cs b/SQLSchemaCompare.UI/Middlewares/RequestValidatorMiddleware.cs index a9239d1..025103b 100644 --- a/SQLSchemaCompare.UI/Middlewares/RequestValidatorMiddleware.cs +++ b/SQLSchemaCompare.UI/Middlewares/RequestValidatorMiddleware.cs @@ -70,7 +70,10 @@ async Task InvokeAsyncInternal(HttpContext context) } else { - this.logger.LogError($"Request refused. Token:{authToken}; UserAgent:{userAgent}"); + string sanitizedAuthToken = (authToken ?? string.Empty).Replace("\r", string.Empty).Replace("\n", string.Empty); + string sanitizedUserAgent = (userAgent ?? string.Empty).Replace("\r", string.Empty).Replace("\n", string.Empty); + + this.logger.LogError("Request refused. Token:{Token}; UserAgent:{UserAgent}", sanitizedAuthToken, sanitizedUserAgent); context.Response.Body = new MemoryStream(0); } } diff --git a/SQLSchemaCompare.UI/Pages/Project/ProjectPageModel.cshtml.cs b/SQLSchemaCompare.UI/Pages/Project/ProjectPageModel.cshtml.cs index 9de5b3b..75ea61c 100644 --- a/SQLSchemaCompare.UI/Pages/Project/ProjectPageModel.cshtml.cs +++ b/SQLSchemaCompare.UI/Pages/Project/ProjectPageModel.cshtml.cs @@ -142,30 +142,22 @@ public IActionResult OnPostLoadProject([FromBody] LoadProjectRequest req) this.projectService.LoadProject(req.Filename); } - catch (InvalidOperationException ex) - { - this.logger.LogError(ex, $"Error loading project: {req.Filename}"); - return new JsonResult(new ApiResponse { Success = false, ErrorCode = EErrorCode.ErrorCannotLoadProject, ErrorMessage = string.Format(CultureInfo.InvariantCulture, Localization.ErrorLoadProjectInvalidProjectFile, this.appGlobals.ProductName) }); - } - catch (FileNotFoundException ex) - { - this.logger.LogError(ex, $"Error loading project: {req.Filename}"); - return new JsonResult(new ApiResponse { Success = false, ErrorCode = EErrorCode.ErrorCannotLoadProject, ErrorMessage = Localization.ErrorLoadProjectFileNotFound }); - } - catch (UnauthorizedAccessException ex) - { - this.logger.LogError(ex, $"Error loading project: {req.Filename}"); - return new JsonResult(new ApiResponse { Success = false, ErrorCode = EErrorCode.ErrorCannotLoadProject, ErrorMessage = Localization.ErrorLoadProjectUnauthorizedFileAccess }); - } - catch (IOException ex) - { - this.logger.LogError(ex, $"Error loading project: {req.Filename}"); - return new JsonResult(new ApiResponse { Success = false, ErrorCode = EErrorCode.ErrorCannotLoadProject, ErrorMessage = string.Format(CultureInfo.InvariantCulture, Localization.ErrorLoadProjectIOError, ex.Message) }); - } catch (Exception ex) { - this.logger.LogError(ex, $"Error loading project: {req.Filename}"); - return new JsonResult(new ApiResponse { Success = false, ErrorCode = EErrorCode.ErrorCannotLoadProject, ErrorMessage = string.Format(CultureInfo.InvariantCulture, Localization.ErrorLoadProject, ex.Message) }); + this.logger.LogError(ex, "Error loading project: {Filename}", req.Filename); + return new JsonResult(new ApiResponse + { + Success = false, + ErrorCode = EErrorCode.ErrorCannotLoadProject, + ErrorMessage = ex switch + { + InvalidOperationException => string.Format(CultureInfo.InvariantCulture, Localization.ErrorLoadProjectInvalidProjectFile, this.appGlobals.ProductName), + FileNotFoundException => Localization.ErrorLoadProjectFileNotFound, + UnauthorizedAccessException => Localization.ErrorLoadProjectUnauthorizedFileAccess, + IOException => string.Format(CultureInfo.InvariantCulture, Localization.ErrorLoadProjectIOError, ex.Message), + _ => string.Format(CultureInfo.InvariantCulture, Localization.ErrorLoadProject, ex.Message), + }, + }); } var appSettings = this.appSettingsService.GetAppSettings(); @@ -409,7 +401,7 @@ private ADatabaseProviderOptions GetDatabaseProviderOptions(CompareProjectOption Database = database, }; default: - this.logger.LogError($"Unknown Database type: {type}"); + this.logger.LogError("Unknown Database type: {DatabaseType}", type); throw new ArgumentException("Unknown Database type"); } } diff --git a/SQLSchemaCompare.UI/Pages/SettingsPageModel.cshtml.cs b/SQLSchemaCompare.UI/Pages/SettingsPageModel.cshtml.cs index e17d17e..f5df10a 100644 --- a/SQLSchemaCompare.UI/Pages/SettingsPageModel.cshtml.cs +++ b/SQLSchemaCompare.UI/Pages/SettingsPageModel.cshtml.cs @@ -75,8 +75,8 @@ public ActionResult OnPostSave([FromBody] AppSettings settings) ArgumentNullException.ThrowIfNull(settings); this.logger.LogDebug("Saving settings..."); - this.logger.LogDebug($"LogLevel => {settings.LogLevel}"); - this.logger.LogDebug($"Language => {settings.Language}"); + this.logger.LogDebug("LogLevel => {LogLevel}", settings.LogLevel); + this.logger.LogDebug("Language => {Language}", settings.Language); var currentSettings = this.appSettingsService.GetAppSettings(); diff --git a/SQLSchemaCompare.UI/SQLSchemaCompare.UI.csproj b/SQLSchemaCompare.UI/SQLSchemaCompare.UI.csproj index dfa45ef..e5be5ef 100644 --- a/SQLSchemaCompare.UI/SQLSchemaCompare.UI.csproj +++ b/SQLSchemaCompare.UI/SQLSchemaCompare.UI.csproj @@ -44,13 +44,13 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/SQLSchemaCompare.UI/WebServer/WebServerStartup.cs b/SQLSchemaCompare.UI/WebServer/WebServerStartup.cs index 91fcf40..57cef29 100644 --- a/SQLSchemaCompare.UI/WebServer/WebServerStartup.cs +++ b/SQLSchemaCompare.UI/WebServer/WebServerStartup.cs @@ -84,8 +84,8 @@ public static void Configure( localizationService.SetLanguage(appSettings.Language); logger.LogDebug("Configuring WebHost..."); - logger.LogDebug($"LogLevel => {appSettings.LogLevel}"); - logger.LogDebug($"Language => {appSettings.Language}"); + logger.LogDebug("LogLevel => {LogLevel}", appSettings.LogLevel); + logger.LogDebug("Language => {Language}", appSettings.Language); app.UseStaticFiles(); app.UseExceptionHandler("/ErrorPage"); diff --git a/SQLSchemaCompare.UI/packages.lock.json b/SQLSchemaCompare.UI/packages.lock.json index 50a715e..dc79b81 100644 --- a/SQLSchemaCompare.UI/packages.lock.json +++ b/SQLSchemaCompare.UI/packages.lock.json @@ -4,20 +4,20 @@ "net10.0": { "Microsoft.AspNetCore.Mvc.NewtonsoftJson": { "type": "Direct", - "requested": "[10.0.7, )", - "resolved": "10.0.7", - "contentHash": "z3aAaAEav7PYOLGRQfD9VuC20SFOoO1BgaTPXE20fOm85Uexml3zjY82srgH14frNhO3uNbu1UE5w3gt3KxWcQ==", + "requested": "[10.0.8, )", + "resolved": "10.0.8", + "contentHash": "LAZmDrEsExc11l7nyQ+efQHTKp4MOskAuPSgkW64LoxrJv2YnElc4IM1VGfIHNRspqVguO5TY5kz2YTRcNSHeQ==", "dependencies": { - "Microsoft.AspNetCore.JsonPatch": "10.0.7", + "Microsoft.AspNetCore.JsonPatch": "10.0.8", "Newtonsoft.Json": "13.0.3", "Newtonsoft.Json.Bson": "1.0.2" } }, "Microsoft.Extensions.FileProviders.Embedded": { "type": "Direct", - "requested": "[10.0.7, )", - "resolved": "10.0.7", - "contentHash": "Btm5vy3ZjIy4GwG5EGSnayiUrLeDsJ6n+RgaPs2xbjA53tXRTCtkZ9v086qHF71tJuVmQiJ8o0IXlm2XVibXJw==" + "requested": "[10.0.8, )", + "resolved": "10.0.8", + "contentHash": "Wv9s0rmrmUEma268HCqqcHGgJI30O9mqMxnORZ/QFxtbjoTFEuMvnqL2kIfbZcOGD6XF6II47Hc6YSff0jKGkw==" }, "Microsoft.TypeScript.MSBuild": { "type": "Direct", @@ -27,11 +27,11 @@ }, "Neolution.CodeAnalysis": { "type": "Direct", - "requested": "[3.2.2, )", - "resolved": "3.2.2", - "contentHash": "9eBWPh7DNlBje/vH1q5Z4Q5FjwahYavPE2NsJO78IRcQ0xDrhor2FY8DxLA26BsweMqn4Ej0cN5dnyFexjl+ww==", + "requested": "[3.3.0-beta.2, )", + "resolved": "3.3.0-beta.2", + "contentHash": "88mG4f4P16K4Ql3uTqeaoeXGJLNMReFh9z3ZKmKZ0bY4RTk4z4syjuF/TefouGM2hR+mcBSdWbAtsKT/+FowlA==", "dependencies": { - "SonarAnalyzer.CSharp": "9.20.0.85982", + "SonarAnalyzer.CSharp": "9.32.0.97167", "StyleCop.Analyzers.Unstable": "1.2.0.556" } }, @@ -81,8 +81,8 @@ }, "Microsoft.AspNetCore.JsonPatch": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "EKAXIhmjgUIz/y1IRGAKOfbJhkl/CXbeD6mn+f7mtn3cRSq+xBBYxsoXaF3Dob5J3LIGdiZumCmHV9MkO5P7lQ==", + "resolved": "10.0.8", + "contentHash": "xGMQwR06DxQSpSUdYvUPLQkjcQUAXnFIUbNoafAcLvUXDnmKNEuddxKvrGoWDT7svt90wWet2Xve5uacO/pVtw==", "dependencies": { "Newtonsoft.Json": "13.0.3" } @@ -120,38 +120,38 @@ }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "G6yclVO5/csPzzsymV0SemY2NDqE31CP5M3jprF5IuO9wJsh4aUOfYD8HCLuDmM1D1CfReegVic48O2r79d46Q==", + "resolved": "10.0.8", + "contentHash": "EJx+fIBMgBlgD+ublKCn+GTOJkw3UqV7xOjYWBRVdUYyIm8UfvAsmSOPFiIInsWTHyMEYUJ9gCJY1jwX+6UB7w==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "10.0.7", - "Microsoft.EntityFrameworkCore.Analyzers": "10.0.7" + "Microsoft.EntityFrameworkCore.Abstractions": "10.0.8", + "Microsoft.EntityFrameworkCore.Analyzers": "10.0.8" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "TuxExnfIS/bSq3z2CbH0LwZH1oyj9iHhSGneU4fpxl3ikjZGZdSae9gcfnImV1rufH8f/ab1NnHwyL2BLyeZOg==" + "resolved": "10.0.8", + "contentHash": "jbKDXWPZQhuPHygMnwzNOqxBADVcpRVytcKYZsA++QqhPkpF93Ta8o5mbJQGrARSjlkr9WtOaADV97EDMOZ7DA==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "eZnMyiJzo249Ejg5CaFScvJS0u7neQfS9DXknAHTO6FHVMM99gO0byNXHGZmA/BOkZ13ngeVziQLHTMOtgescg==" + "resolved": "10.0.8", + "contentHash": "M3BZ8JH8rB6BE7dO2g9iVbrHLnEz9wMXT6q+tDR6Nq3gyP3KmBj5OTiZGxyF3vesjOQNKanYoPGSNBR4kR2llg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "midwPufIwXhOJcVhaZpCZGNbjy2QoPfHI+70nw2dGcoULEW9DybMvMPYkRjOJV0eI46a1oVFhU4lFYDEx6YUbg==", + "resolved": "10.0.8", + "contentHash": "UU3diAD2wwZveye2rnrwaF/wvJ9tm5iL2fuY9TTap6/iGQK1OO29M1BzXZRlRPVH/dByt5w/pISBSFtyR7hTqw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "10.0.7" + "Microsoft.EntityFrameworkCore": "10.0.8" } }, "Microsoft.EntityFrameworkCore.SqlServer": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "jci/dpjLIZyrp0Kbt0kr1lh+7BXbJ3wNk+vTwS/Se65grEJSBC+eE2UAQsi/xSNB5lHP2dysyOMHugkpFwQwNA==", + "resolved": "10.0.8", + "contentHash": "A+FLIsTH9l5DG2iD6QW6Mfwlvr+BjWme/jJ2hvwmmENTr7lR1UWmgCtKCjDYcHxqdAD15bb4PgQnSzw12DV/pw==", "dependencies": { "Microsoft.Data.SqlClient": "6.1.1", - "Microsoft.EntityFrameworkCore.Relational": "10.0.7" + "Microsoft.EntityFrameworkCore.Relational": "10.0.8" } }, "Microsoft.Identity.Client": { @@ -224,10 +224,10 @@ }, "Microting.EntityFrameworkCore.MySql": { "type": "Transitive", - "resolved": "10.0.7", - "contentHash": "FNohIzR0HuCsGNc8kHDeICt3cReGCGO0mZ5SOzcTlmZZgZux7GN/ekBcjGb2LwT81wJIi0R5Xh1xZrPXvF7m9A==", + "resolved": "10.0.8", + "contentHash": "vaxt+8dU7WODnxl5/2k4VH+LNgbQHk+yGIqWum619+6lICCmbLHyYyzqgJRGzic+Aeyh212TeH5fHklfXAjWVw==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "[10.0.7, 10.0.999]", + "Microsoft.EntityFrameworkCore.Relational": "[10.0.8, 10.0.999]", "MySqlConnector": "2.5.0" } }, @@ -274,8 +274,8 @@ }, "SonarAnalyzer.CSharp": { "type": "Transitive", - "resolved": "9.20.0.85982", - "contentHash": "c0IYtFg4mYusTafTy0Bs5wev45vRKNShkuoWyQyPMbC6imEFHL7tY/7xbbUJd6JNLYx5vP8wyi2LgiBsMHqb2Q==" + "resolved": "9.32.0.97167", + "contentHash": "Yxk86RV+8ynJpUhku1Yw2hITFmnmXKkXJ73cIFSy85ol5SnWREQg9RuTyV8nI7V7+pyLKpCfRmD7P0widsgjkg==" }, "StyleCop.Analyzers.Unstable": { "type": "Transitive", @@ -336,9 +336,9 @@ "TiCodeX.SQLSchemaCompare.Infrastructure": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "[10.0.7, )", - "Microsoft.EntityFrameworkCore.SqlServer": "[10.0.7, )", - "Microting.EntityFrameworkCore.MySql": "[10.0.7, )", + "Microsoft.EntityFrameworkCore.Relational": "[10.0.8, )", + "Microsoft.EntityFrameworkCore.SqlServer": "[10.0.8, )", + "Microting.EntityFrameworkCore.MySql": "[10.0.8, )", "Npgsql.EntityFrameworkCore.PostgreSQL": "[10.0.1, )", "TiCodeX.SQLSchemaCompare.Services": "[2026.5.1, )" }