diff --git a/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/Projects/SetDatabaseSchemaProvider.cs b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/Projects/SetDatabaseSchemaProvider.cs
new file mode 100644
index 00000000..951fdf6b
--- /dev/null
+++ b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/Projects/SetDatabaseSchemaProvider.cs
@@ -0,0 +1,31 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+#nullable disable
+
+using Microsoft.SqlTools.Hosting.Protocol.Contracts;
+using Microsoft.SqlTools.ServiceLayer.Utility;
+
+namespace Microsoft.SqlTools.ServiceLayer.SqlProjects.Contracts
+{
+ ///
+ /// Parameters for setting the DatabaseSchemaProvider property of a SQL project
+ ///
+ public class SetDatabaseSchemaProviderParams : SqlProjectParams
+ {
+ ///
+ /// New DatabaseSchemaProvider value, in the form "Microsoft.Data.Tools.Schema.Sql.SqlXYZDatabaseSchemaProvider"
+ ///
+ public string DatabaseSchemaProvider { get; set; }
+ }
+
+ ///
+ /// Set the DatabaseSchemaProvider property of a SQL project
+ ///
+ public class SetDatabaseSchemaProviderRequest
+ {
+ public static readonly RequestType Type = RequestType.Create("sqlProjects/setDatabaseSchemaProvider");
+ }
+}
diff --git a/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/SqlProjectsService.cs b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/SqlProjectsService.cs
index 95a2d52e..6b9f0bc1 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/SqlProjectsService.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/SqlProjectsService.cs
@@ -48,6 +48,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
serviceHost.SetRequestHandler(UpdateProjectForCrossPlatformRequest.Type, HandleUpdateProjectForCrossPlatformRequest, isParallelProcessingSupported: false);
serviceHost.SetRequestHandler(GetProjectPropertiesRequest.Type, HandleGetProjectPropertiesRequest, isParallelProcessingSupported: true);
serviceHost.SetRequestHandler(SetDatabaseSourceRequest.Type, HandleSetDatabaseSourceRequest, isParallelProcessingSupported: false);
+ serviceHost.SetRequestHandler(SetDatabaseSchemaProviderRequest.Type, HandleSetDatabaseSchemaProviderRequest, isParallelProcessingSupported: false);
// SQL object script functions
serviceHost.SetRequestHandler(GetSqlObjectScriptsRequest.Type, HandleGetSqlObjectScriptsRequest, isParallelProcessingSupported: true);
@@ -162,6 +163,11 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).Properties.DatabaseSource = requestParams.DatabaseSource, requestContext);
}
+ internal async Task HandleSetDatabaseSchemaProviderRequest(SetDatabaseSchemaProviderParams requestParams, RequestContext requestContext)
+ {
+ await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).DatabaseSchemaProvider = requestParams.DatabaseSchemaProvider, requestContext);
+ }
+
#endregion
#region Script/folder functions
diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SqlProjects/SqlProjectsServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SqlProjects/SqlProjectsServiceTests.cs
index d4505146..32fed4c7 100644
--- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SqlProjects/SqlProjectsServiceTests.cs
+++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SqlProjects/SqlProjectsServiceTests.cs
@@ -846,47 +846,57 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects
SqlProjectsService service = new();
string projectUri = await service.CreateSqlProject();
- MockRequest mock = new();
-
+ MockRequest getMock = new();
await service.HandleGetProjectPropertiesRequest(new SqlProjectParams()
{
ProjectUri = projectUri
- }, mock.Object);
+ }, getMock.Object);
- mock.AssertSuccess(nameof(service.HandleGetProjectPropertiesRequest));
+ getMock.AssertSuccess(nameof(service.HandleGetProjectPropertiesRequest));
- Assert.IsTrue(Guid.TryParse(mock.Result.ProjectGuid, out _), $"{mock.Result.ProjectGuid} should be set");
- Assert.AreEqual("AnyCPU", mock.Result.Platform);
- Assert.AreEqual("Debug", mock.Result.Configuration);
- Assert.AreEqual(@"bin\Debug\", mock.Result.OutputPath); // default value is normalized to Windows slashes
- Assert.AreEqual("SQL_Latin1_General_CP1_CI_AS", mock.Result.DefaultCollation);
- Assert.IsNull(mock.Result.DatabaseSource, nameof(mock.Result.DatabaseSource)); // validate DatabaseSource is null when the tag isn't present
- Assert.AreEqual(ProjectType.SdkStyle, mock.Result.ProjectStyle);
- Assert.AreEqual("Microsoft.Data.Tools.Schema.Sql.Sql160DatabaseSchemaProvider", mock.Result.DatabaseSchemaProvider);
+ Assert.IsTrue(Guid.TryParse(getMock.Result.ProjectGuid, out _), $"{getMock.Result.ProjectGuid} should be set");
+ Assert.AreEqual("AnyCPU", getMock.Result.Platform);
+ Assert.AreEqual("Debug", getMock.Result.Configuration);
+ Assert.AreEqual(@"bin\Debug\", getMock.Result.OutputPath); // default value is normalized to Windows slashes
+ Assert.AreEqual("SQL_Latin1_General_CP1_CI_AS", getMock.Result.DefaultCollation);
+ Assert.IsNull(getMock.Result.DatabaseSource, nameof(getMock.Result.DatabaseSource)); // validate DatabaseSource is null when the tag isn't present
+ Assert.AreEqual(ProjectType.SdkStyle, getMock.Result.ProjectStyle);
+ Assert.AreEqual("Microsoft.Data.Tools.Schema.Sql.Sql160DatabaseSchemaProvider", getMock.Result.DatabaseSchemaProvider);
// Validate that DatabaseSource can be set when the tag doesn't exist
- MockRequest setSourceMock = new();
+ MockRequest setMock = new();
await service.HandleSetDatabaseSourceRequest(new SetDatabaseSourceParams()
{
ProjectUri = projectUri,
DatabaseSource = "TestSource"
- }, setSourceMock.Object);
+ }, setMock.Object);
- setSourceMock.AssertSuccess(nameof(service.HandleSetDatabaseSourceRequest));
+ setMock.AssertSuccess(nameof(service.HandleSetDatabaseSourceRequest));
Assert.AreEqual("TestSource", service.Projects[projectUri].Properties.DatabaseSource);
// Validate DatabaseSource is read when it has a value
- mock = new();
-
+ getMock = new();
await service.HandleGetProjectPropertiesRequest(new SqlProjectParams()
{
ProjectUri = projectUri
- }, mock.Object);
+ }, getMock.Object);
- mock.AssertSuccess(nameof(service.HandleGetProjectPropertiesRequest));
- Assert.AreEqual("TestSource", mock.Result.DatabaseSource);
+ getMock.AssertSuccess(nameof(service.HandleGetProjectPropertiesRequest));
+ Assert.AreEqual("TestSource", getMock.Result.DatabaseSource);
+
+ // Validate that DatabaseSchemaProvider can be set
+
+ setMock = new();
+ await service.HandleSetDatabaseSchemaProviderRequest(new SetDatabaseSchemaProviderParams()
+ {
+ ProjectUri = projectUri,
+ DatabaseSchemaProvider = "Microsoft.Data.Tools.Schema.Sql.SqlAzureV12DatabaseSchemaProvider"
+ }, setMock.Object);
+
+ setMock.AssertSuccess(nameof(service.HandleSetDatabaseSchemaProviderRequest));
+ Assert.AreEqual("Microsoft.Data.Tools.Schema.Sql.SqlAzureV12DatabaseSchemaProvider", service.Projects[projectUri].DatabaseSchemaProvider);
}
#region Helpers