v10: Support System.Data.SqlClient provider name (#12408)

* Add support for System.Data.SqlClient provider name

* Only update connection string when required

(cherry picked from commit e82bcb1b76)
This commit is contained in:
Ronald Barendse
2022-05-17 07:33:54 +02:00
committed by Bjarke Berg
parent fd0637c96d
commit e90bf26577
3 changed files with 18 additions and 14 deletions

View File

@@ -2,6 +2,7 @@ using System.Data.Common;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Core.DistributedLocking;
using Umbraco.Cms.Infrastructure.Persistence;
@@ -37,6 +38,15 @@ public static class UmbracoBuilderExtensions
DbProviderFactories.UnregisterFactory(Constants.ProviderName);
DbProviderFactories.RegisterFactory(Constants.ProviderName, SqlClientFactory.Instance);
// Support provider name set by the configuration API for connection string environment variables
builder.Services.ConfigureAll<ConnectionStrings>(options =>
{
if (options.ProviderName == "System.Data.SqlClient")
{
options.ProviderName = Constants.ProviderName;
}
});
return builder;
}
}

View File

@@ -39,28 +39,21 @@ public static class UmbracoBuilderExtensions
DbProviderFactories.UnregisterFactory(Constants.ProviderName);
DbProviderFactories.RegisterFactory(Constants.ProviderName, Microsoft.Data.Sqlite.SqliteFactory.Instance);
builder.Services.PostConfigure<ConnectionStrings>(Core.Constants.System.UmbracoConnectionName, opt =>
// Prevent accidental creation of SQLite database files
builder.Services.PostConfigureAll<ConnectionStrings>(options =>
{
if (!opt.IsConnectionStringConfigured())
// Skip empty connection string and other providers
if (!options.IsConnectionStringConfigured() || options.ProviderName != Constants.ProviderName)
{
return;
}
if (opt.ProviderName != Constants.ProviderName)
{
// Not us.
return;
}
// Prevent accidental creation of database files.
var connectionStringBuilder = new SqliteConnectionStringBuilder(opt.ConnectionString);
var connectionStringBuilder = new SqliteConnectionStringBuilder(options.ConnectionString);
if (connectionStringBuilder.Mode == SqliteOpenMode.ReadWriteCreate)
{
connectionStringBuilder.Mode = SqliteOpenMode.ReadWrite;
options.ConnectionString = connectionStringBuilder.ConnectionString;
}
opt.ConnectionString = connectionStringBuilder.ConnectionString;
});
return builder;

View File

@@ -18,11 +18,12 @@ public class ConfigureConnectionStrings : IConfigureNamedOptions<ConnectionStrin
public ConfigureConnectionStrings(IConfiguration configuration) => _configuration = configuration;
/// <inheritdoc />
public void Configure(ConnectionStrings options) => Configure(Constants.System.UmbracoConnectionName, options);
public void Configure(ConnectionStrings options) => Configure(Options.DefaultName, options);
/// <inheritdoc />
public void Configure(string name, ConnectionStrings options)
{
// Default to using UmbracoConnectionName
if (name == Options.DefaultName)
{
name = Constants.System.UmbracoConnectionName;