Database Manager
done: + master.sql as resource + implemented incremental database changes also for Master + dbUp sql script variables implemented + improved database handling and creation code + simpified database creation + almost all Database and Tenant creation moved to DatabaseManager.cs (rest code marked with TODO) + Unattended install of master can be performed by settings in appsettings.json + Improved IsInstalled checking + Removed DBSchema field from Tenant + Default database and site creation moved to Program.Main
This commit is contained in:
@ -22,21 +22,11 @@ namespace Oqtane.Repository
|
||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||
{
|
||||
optionsBuilder.UseSqlServer(_tenant.DBConnectionString
|
||||
.Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory").ToString())
|
||||
.Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory")?.ToString())
|
||||
);
|
||||
base.OnConfiguring(optionsBuilder);
|
||||
}
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
base.OnModelCreating(modelBuilder);
|
||||
|
||||
if (_tenant.DBSchema != "")
|
||||
{
|
||||
modelBuilder.HasDefaultSchema(_tenant.DBSchema);
|
||||
}
|
||||
}
|
||||
|
||||
public override int SaveChanges()
|
||||
{
|
||||
ChangeTracker.DetectChanges();
|
||||
|
23
Oqtane.Server/Repository/Context/InstallationContext.cs
Normal file
23
Oqtane.Server/Repository/Context/InstallationContext.cs
Normal file
@ -0,0 +1,23 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Oqtane.Models;
|
||||
|
||||
namespace Oqtane.Repository
|
||||
{
|
||||
|
||||
public class InstallationContext : DbContext
|
||||
{
|
||||
private readonly string _connectionString;
|
||||
|
||||
public InstallationContext(string connectionString)
|
||||
{
|
||||
_connectionString = connectionString;
|
||||
}
|
||||
|
||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||
=> optionsBuilder.UseSqlServer(_connectionString);
|
||||
|
||||
public virtual DbSet<ApplicationVersion> ApplicationVersion { get; set; }
|
||||
public virtual DbSet<Tenant> Tenant { get; set; }
|
||||
}
|
||||
}
|
@ -41,7 +41,7 @@ namespace Oqtane.Repository
|
||||
var siteTemplateObject = ActivatorUtilities.CreateInstance(_serviceProvider, siteTemplateType);
|
||||
siteTemplate = new SiteTemplate
|
||||
{
|
||||
Name = (string)siteTemplateType.GetProperty("Name").GetValue(siteTemplateObject),
|
||||
Name = (string)siteTemplateType.GetProperty("Name")?.GetValue(siteTemplateObject),
|
||||
TypeName = siteTemplateType.AssemblyQualifiedName
|
||||
};
|
||||
siteTemplates.Add(siteTemplate);
|
||||
|
@ -49,10 +49,14 @@ namespace Oqtane.Repository
|
||||
}
|
||||
|
||||
public void DeleteTenant(int tenantId)
|
||||
{
|
||||
{
|
||||
Tenant tenant = _db.Tenant.Find(tenantId);
|
||||
_db.Tenant.Remove(tenant);
|
||||
_db.SaveChanges();
|
||||
if (tenant != null)
|
||||
{
|
||||
_db.Tenant.Remove(tenant);
|
||||
_db.SaveChanges();
|
||||
}
|
||||
|
||||
_cache.Remove("tenants");
|
||||
}
|
||||
}
|
||||
|
@ -29,43 +29,41 @@ namespace Oqtane.Repository
|
||||
{
|
||||
aliasName = accessor.HttpContext.Request.Host.Value;
|
||||
string path = accessor.HttpContext.Request.Path.Value;
|
||||
string[] segments = path.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
string[] segments = path.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (segments.Length > 1 && segments[1] == "api" && segments[0] != "~")
|
||||
{
|
||||
aliasName += "/" + segments[0];
|
||||
}
|
||||
|
||||
if (aliasName.EndsWith("/"))
|
||||
{
|
||||
aliasName = aliasName.Substring(0, aliasName.Length - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
else // background processes can pass in an alias using the SiteState service
|
||||
else // background processes can pass in an alias using the SiteState service
|
||||
{
|
||||
if (siteState != null)
|
||||
{
|
||||
aliasId = siteState.Alias.AliasId;
|
||||
}
|
||||
aliasId = siteState?.Alias?.AliasId ?? -1;
|
||||
}
|
||||
|
||||
// get the alias and tenant
|
||||
if (aliasId != -1 || aliasName != "")
|
||||
IEnumerable<Alias> aliases = aliasRepository.GetAliases().ToList(); // cached
|
||||
if (aliasId != -1)
|
||||
{
|
||||
IEnumerable<Alias> aliases = aliasRepository.GetAliases(); // cached
|
||||
IEnumerable<Tenant> tenants = tenantRepository.GetTenants(); // cached
|
||||
_alias = aliases.FirstOrDefault(item => item.AliasId == aliasId);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
_alias = aliases.FirstOrDefault(item => item.Name == aliasName
|
||||
//if here is only one alias and other methods fail, take it (case of startup install)
|
||||
|| aliases.Count() == 1);
|
||||
}
|
||||
|
||||
if (aliasId != -1)
|
||||
{
|
||||
_alias = aliases.FirstOrDefault(item => item.AliasId == aliasId);
|
||||
}
|
||||
else
|
||||
{
|
||||
_alias = aliases.FirstOrDefault(item => item.Name == aliasName);
|
||||
}
|
||||
if (_alias != null)
|
||||
{
|
||||
_tenant = tenants.FirstOrDefault(item => item.TenantId == _alias.TenantId);
|
||||
}
|
||||
if (_alias != null)
|
||||
{
|
||||
IEnumerable<Tenant> tenants = tenantRepository.GetTenants(); // cached
|
||||
_tenant = tenants.FirstOrDefault(item => item.TenantId == _alias.TenantId);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user