fix #2567 - migrate tenant connection string details from database to appsettings.json
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
@ -6,11 +7,13 @@ using Microsoft.AspNetCore.Identity;
|
||||
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Oqtane.Databases.Interfaces;
|
||||
using Oqtane.Extensions;
|
||||
using Oqtane.Infrastructure;
|
||||
using Oqtane.Migrations.Framework;
|
||||
using Oqtane.Models;
|
||||
using Oqtane.Shared;
|
||||
|
||||
// ReSharper disable BuiltInTypeReferenceStyleForMemberAccess
|
||||
|
||||
@ -18,17 +21,17 @@ namespace Oqtane.Repository
|
||||
{
|
||||
public class DBContextBase : IdentityUserContext<IdentityUser>
|
||||
{
|
||||
private readonly ITenantResolver _tenantResolver;
|
||||
private readonly ITenantManager _tenantManager;
|
||||
private readonly IHttpContextAccessor _accessor;
|
||||
private string _connectionString;
|
||||
private string _databaseType;
|
||||
private readonly IConfigurationRoot _config;
|
||||
private string _connectionString = "";
|
||||
private string _databaseType = "";
|
||||
|
||||
public DBContextBase(ITenantManager tenantManager, IHttpContextAccessor httpContextAccessor)
|
||||
public DBContextBase(IDBContextDependencies DBContextDependencies)
|
||||
{
|
||||
_connectionString = String.Empty;
|
||||
_tenantManager = tenantManager;
|
||||
_accessor = httpContextAccessor;
|
||||
_tenantManager = DBContextDependencies.TenantManager;
|
||||
_accessor = DBContextDependencies.Accessor;
|
||||
_config = DBContextDependencies.Config;
|
||||
}
|
||||
|
||||
public IDatabase ActiveDatabase { get; set; }
|
||||
@ -39,21 +42,11 @@ namespace Oqtane.Repository
|
||||
|
||||
if (string.IsNullOrEmpty(_connectionString))
|
||||
{
|
||||
|
||||
Tenant tenant;
|
||||
if (_tenantResolver != null)
|
||||
{
|
||||
tenant = _tenantResolver.GetTenant();
|
||||
}
|
||||
else
|
||||
{
|
||||
tenant = _tenantManager.GetTenant();
|
||||
}
|
||||
|
||||
Tenant tenant = _tenantManager.GetTenant();
|
||||
if (tenant != null)
|
||||
{
|
||||
_connectionString = tenant.DBConnectionString
|
||||
.Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory")?.ToString());
|
||||
_connectionString = _config.GetConnectionString(tenant.DBConnectionString)
|
||||
.Replace($"|{Constants.DataDirectory}|", AppDomain.CurrentDomain.GetData(Constants.DataDirectory)?.ToString());
|
||||
_databaseType = tenant.DBType;
|
||||
}
|
||||
}
|
||||
@ -93,12 +86,17 @@ namespace Oqtane.Repository
|
||||
return base.SaveChangesAsync(cancellationToken);
|
||||
}
|
||||
|
||||
[Obsolete("This constructor is obsolete. Use DBContextBase(ITenantManager tenantManager, IHttpContextAccessor httpContextAccessor) instead.", false)]
|
||||
public DBContextBase(ITenantResolver tenantResolver, IHttpContextAccessor httpContextAccessor)
|
||||
[Obsolete("This constructor is obsolete. Use DBContextBase(IDBContextDependencies DBContextDependencies) instead.", false)]
|
||||
public DBContextBase(ITenantManager tenantManager, IHttpContextAccessor httpContextAccessor)
|
||||
{
|
||||
_connectionString = String.Empty;
|
||||
_tenantResolver = tenantResolver;
|
||||
_tenantManager = tenantManager;
|
||||
_accessor = httpContextAccessor;
|
||||
|
||||
// anti-pattern used to reference config service in base class without causing breaking change
|
||||
_config = new ConfigurationBuilder()
|
||||
.SetBasePath(Directory.GetCurrentDirectory())
|
||||
.AddJsonFile("appsettings.json")
|
||||
.Build();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
20
Oqtane.Server/Repository/Context/DBContextDependencies.cs
Normal file
20
Oqtane.Server/Repository/Context/DBContextDependencies.cs
Normal file
@ -0,0 +1,20 @@
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Oqtane.Infrastructure;
|
||||
|
||||
namespace Oqtane.Repository
|
||||
{
|
||||
public class DBContextDependencies : IDBContextDependencies
|
||||
{
|
||||
public DBContextDependencies(ITenantManager tenantManager, IHttpContextAccessor httpContextAccessor, IConfigurationRoot config)
|
||||
{
|
||||
TenantManager = tenantManager;
|
||||
Accessor = httpContextAccessor;
|
||||
Config = config;
|
||||
}
|
||||
|
||||
public ITenantManager TenantManager { get; }
|
||||
public IHttpContextAccessor Accessor { get; }
|
||||
public IConfigurationRoot Config { get; }
|
||||
}
|
||||
}
|
@ -1,8 +1,5 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Storage;
|
||||
using Oqtane.Databases.Interfaces;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Oqtane.Extensions;
|
||||
using Oqtane.Interfaces;
|
||||
using Oqtane.Models;
|
||||
using IDatabase = Oqtane.Databases.Interfaces.IDatabase;
|
||||
|
||||
|
@ -41,8 +41,8 @@ namespace Oqtane.Repository
|
||||
{
|
||||
if (_config.IsInstalled())
|
||||
{
|
||||
_connectionString = _config.GetConnectionString("DefaultConnection")
|
||||
.Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory")?.ToString());
|
||||
_connectionString = _config.GetConnectionString(SettingKeys.ConnectionStringKey)
|
||||
.Replace($"|{Constants.DataDirectory}|", AppDomain.CurrentDomain.GetData(Constants.DataDirectory)?.ToString());
|
||||
}
|
||||
|
||||
_databaseType = _config.GetSection(SettingKeys.DatabaseSection)[SettingKeys.DatabaseTypeKey];
|
||||
|
@ -1,6 +1,4 @@
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Oqtane.Infrastructure;
|
||||
using Oqtane.Models;
|
||||
using Oqtane.Repository.Databases.Interfaces;
|
||||
|
||||
@ -12,7 +10,7 @@ namespace Oqtane.Repository
|
||||
{
|
||||
public class TenantDBContext : DBContextBase, IMultiDatabase
|
||||
{
|
||||
public TenantDBContext(ITenantManager tenantManager, IHttpContextAccessor httpContextAccessor) : base(tenantManager, httpContextAccessor) { }
|
||||
public TenantDBContext(IDBContextDependencies DBContextDependencies) : base(DBContextDependencies) { }
|
||||
|
||||
public virtual DbSet<Site> Site { get; set; }
|
||||
public virtual DbSet<Page> Page { get; set; }
|
||||
|
@ -0,0 +1,13 @@
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Oqtane.Infrastructure;
|
||||
|
||||
namespace Oqtane.Repository
|
||||
{
|
||||
public interface IDBContextDependencies
|
||||
{
|
||||
ITenantManager TenantManager { get; }
|
||||
IHttpContextAccessor Accessor { get; }
|
||||
IConfigurationRoot Config { get; }
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using System.Data;
|
||||
using System.Data;
|
||||
using System.Reflection;
|
||||
using Oqtane.Models;
|
||||
|
||||
@ -18,6 +18,8 @@ namespace Oqtane.Repository
|
||||
|
||||
IDataReader ExecuteReader(Tenant tenant, string query);
|
||||
|
||||
IDataReader ExecuteReader(string DBType, string DBConnectionString, string query);
|
||||
|
||||
string GetScriptFromAssembly(Assembly assembly, string fileName);
|
||||
}
|
||||
}
|
||||
|
@ -1,11 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Oqtane.Databases.Interfaces;
|
||||
using Oqtane.Interfaces;
|
||||
using Oqtane.Models;
|
||||
// ReSharper disable ConvertToUsingDeclaration
|
||||
// ReSharper disable InvertIf
|
||||
@ -15,6 +14,13 @@ namespace Oqtane.Repository
|
||||
{
|
||||
public class SqlRepository : ISqlRepository
|
||||
{
|
||||
private IConfigurationRoot _config;
|
||||
|
||||
public SqlRepository(IConfigurationRoot config)
|
||||
{
|
||||
_config = config;
|
||||
}
|
||||
|
||||
public void ExecuteScript(Tenant tenant, string script)
|
||||
{
|
||||
// execute script in current tenant
|
||||
@ -75,13 +81,19 @@ namespace Oqtane.Repository
|
||||
public IDataReader ExecuteReader(Tenant tenant, string query)
|
||||
{
|
||||
var db = GetActiveDatabase(tenant.DBType);
|
||||
return db.ExecuteReader(tenant.DBConnectionString, query);
|
||||
return db.ExecuteReader(GetConnectionString(tenant.DBConnectionString), query);
|
||||
}
|
||||
|
||||
public IDataReader ExecuteReader(string DBType, string DBConnectionString, string query)
|
||||
{
|
||||
var db = GetActiveDatabase(DBType);
|
||||
return db.ExecuteReader(GetConnectionString(DBConnectionString), query);
|
||||
}
|
||||
|
||||
public int ExecuteNonQuery(string connectionString, string databaseType, string query)
|
||||
{
|
||||
var db = GetActiveDatabase(databaseType);
|
||||
return db.ExecuteNonQuery(connectionString, query);
|
||||
return db.ExecuteNonQuery(GetConnectionString(connectionString), query);
|
||||
}
|
||||
|
||||
public string GetScriptFromAssembly(Assembly assembly, string fileName)
|
||||
@ -119,5 +131,14 @@ namespace Oqtane.Repository
|
||||
|
||||
return activeDatabase;
|
||||
}
|
||||
|
||||
private string GetConnectionString(string connectionString)
|
||||
{
|
||||
if (!connectionString.Contains("="))
|
||||
{
|
||||
connectionString = _config.GetConnectionString(connectionString);
|
||||
}
|
||||
return connectionString;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user