remove unique index of TenantId and Name from Site table as site name does not need to be unique. Remove TenantId column from Site table as it is not necessary and should be obtained from the Alias.

This commit is contained in:
sbwalker
2025-12-03 15:28:31 -05:00
parent ad993c6180
commit 23d14c62a5
6 changed files with 49 additions and 17 deletions

View File

@@ -683,7 +683,7 @@
{ {
var tenants = await TenantService.GetTenantsAsync(); var tenants = await TenantService.GetTenantsAsync();
var _databases = await DatabaseService.GetDatabasesAsync(); var _databases = await DatabaseService.GetDatabasesAsync();
var tenant = tenants.Find(item => item.TenantId == site.TenantId); var tenant = tenants.Find(item => item.TenantId == PageState.Alias.TenantId);
if (tenant != null) if (tenant != null)
{ {
_tenant = tenant.Name; _tenant = tenant.Name;
@@ -886,17 +886,17 @@
try try
{ {
var aliases = await AliasService.GetAliasesAsync(); var aliases = await AliasService.GetAliasesAsync();
if (aliases.Any(item => item.SiteId != PageState.Site.SiteId || item.TenantId != PageState.Site.TenantId)) if (aliases.Any(item => item.SiteId != PageState.Site.SiteId || item.TenantId != PageState.Alias.TenantId))
{ {
await SiteService.DeleteSiteAsync(PageState.Site.SiteId); await SiteService.DeleteSiteAsync(PageState.Site.SiteId);
await logger.LogInformation("Site Deleted {SiteId}", PageState.Site.SiteId); await logger.LogInformation("Site Deleted {SiteId}", PageState.Site.SiteId);
foreach (Alias alias in aliases.Where(item => item.SiteId == PageState.Site.SiteId && item.TenantId == PageState.Site.TenantId)) foreach (Alias alias in aliases.Where(item => item.SiteId == PageState.Site.SiteId && item.TenantId == PageState.Alias.TenantId))
{ {
await AliasService.DeleteAliasAsync(alias.AliasId); await AliasService.DeleteAliasAsync(alias.AliasId);
} }
var redirect = aliases.First(item => item.SiteId != PageState.Site.SiteId || item.TenantId != PageState.Site.TenantId); var redirect = aliases.First(item => item.SiteId != PageState.Site.SiteId || item.TenantId != PageState.Alias.TenantId);
NavigationManager.NavigateTo(PageState.Uri.Scheme + "://" + redirect.Name, true); NavigationManager.NavigateTo(PageState.Uri.Scheme + "://" + redirect.Name, true);
} }
else else
@@ -993,7 +993,7 @@
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{ {
_aliases = await AliasService.GetAliasesAsync(); _aliases = await AliasService.GetAliasesAsync();
_aliases = _aliases.Where(item => item.SiteId == PageState.Site.SiteId && item.TenantId == PageState.Site.TenantId).OrderBy(item => item.AliasId).ToList(); _aliases = _aliases.Where(item => item.SiteId == PageState.Site.SiteId && item.TenantId == PageState.Alias.TenantId).OrderBy(item => item.AliasId).ToList();
} }
} }
@@ -1046,7 +1046,7 @@
{ {
if (_aliasid == 0) if (_aliasid == 0)
{ {
alias = new Alias { SiteId = PageState.Site.SiteId, TenantId = PageState.Site.TenantId, Name = _aliasname, IsDefault = bool.Parse(_defaultalias) }; alias = new Alias { SiteId = PageState.Site.SiteId, TenantId = PageState.Alias.TenantId, Name = _aliasname, IsDefault = bool.Parse(_defaultalias) };
await AliasService.AddAliasAsync(alias); await AliasService.AddAliasAsync(alias);
} }
else else

View File

@@ -271,7 +271,7 @@
} }
var tenants = await TenantService.GetTenantsAsync(); var tenants = await TenantService.GetTenantsAsync();
_tenant = tenants.Find(item => item.TenantId == PageState.Site.TenantId).Name; _tenant = tenants.Find(item => item.TenantId == PageState.Alias.TenantId).Name;
_history = await MigrationHistoryService.GetMigrationHistoryAsync(); _history = await MigrationHistoryService.GetMigrationHistoryAsync();
_initialized = true; _initialized = true;

View File

@@ -579,7 +579,6 @@ namespace Oqtane.Infrastructure
site = new Site site = new Site
{ {
TenantId = tenant.TenantId,
Name = install.SiteName, Name = install.SiteName,
LogoFileId = null, LogoFileId = null,
FaviconFileId = null, FaviconFileId = null,
@@ -596,7 +595,8 @@ namespace Oqtane.Infrastructure
RenderMode = rendermode, RenderMode = rendermode,
Runtime = runtime, Runtime = runtime,
Prerender = (rendermode == RenderModes.Interactive), Prerender = (rendermode == RenderModes.Interactive),
Hybrid = false Hybrid = false,
TenantId = tenant.TenantId
}; };
site = sites.AddSite(site); site = sites.AddSite(site);

View File

@@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Oqtane.Databases.Interfaces;
using Oqtane.Migrations.EntityBuilders;
using Oqtane.Repository;
namespace Oqtane.Migrations.Tenant
{
[DbContext(typeof(TenantDBContext))]
[Migration("Tenant.10.00.01.02")]
public class RemoveSiteTenantId : MultiDatabaseMigration
{
public RemoveSiteTenantId(IDatabase database) : base(database)
{
}
protected override void Up(MigrationBuilder migrationBuilder)
{
var siteEntityBuilder = new SiteEntityBuilder(migrationBuilder, ActiveDatabase);
siteEntityBuilder.DropIndex("IX_Site"); // TenantId, Name
siteEntityBuilder.DropColumn("TenantId");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
// not implemented
}
}
}

View File

@@ -148,6 +148,8 @@ namespace Oqtane.Services
// installation date used for fingerprinting static assets // installation date used for fingerprinting static assets
site.Fingerprint = Utilities.GenerateSimpleHash(_configManager.GetSetting("InstallationDate", DateTime.UtcNow.ToString("yyyyMMddHHmm"))); site.Fingerprint = Utilities.GenerateSimpleHash(_configManager.GetSetting("InstallationDate", DateTime.UtcNow.ToString("yyyyMMddHHmm")));
site.TenantId = alias.TenantId;
} }
else else
{ {
@@ -181,7 +183,7 @@ namespace Oqtane.Services
{ {
var alias = _tenantManager.GetAlias(); var alias = _tenantManager.GetAlias();
var current = _sites.GetSite(site.SiteId, false); var current = _sites.GetSite(site.SiteId, false);
if (site.SiteId == alias.SiteId && site.TenantId == alias.TenantId && current != null) if (site.SiteId == alias.SiteId && current != null)
{ {
site = _sites.UpdateSite(site); site = _sites.UpdateSite(site);
_syncManager.AddSyncEvent(alias, EntityNames.Site, site.SiteId, SyncEventActions.Update); _syncManager.AddSyncEvent(alias, EntityNames.Site, site.SiteId, SyncEventActions.Update);

View File

@@ -16,11 +16,6 @@ namespace Oqtane.Models
/// </summary> /// </summary>
public int SiteId { get; set; } public int SiteId { get; set; }
/// <summary>
/// Reference to the <see cref="Tenant"/> the Site is in
/// </summary>
public int TenantId { get; set; }
/// <summary> /// <summary>
/// The site Name /// The site Name
/// </summary> /// </summary>
@@ -203,12 +198,17 @@ namespace Oqtane.Models
[NotMapped] [NotMapped]
public string Fingerprint { get; set; } public string Fingerprint { get; set; }
/// <summary>
/// Reference to the <see cref="Tenant"/> the Site belongs to
/// </summary>
[NotMapped]
public int TenantId { get; set; }
public Site Clone() public Site Clone()
{ {
return new Site return new Site
{ {
SiteId = SiteId, SiteId = SiteId,
TenantId = TenantId,
Name = Name, Name = Name,
TimeZoneId = TimeZoneId, TimeZoneId = TimeZoneId,
LogoFileId = LogoFileId, LogoFileId = LogoFileId,
@@ -246,7 +246,8 @@ namespace Oqtane.Models
Pages = Pages.ConvertAll(page => page.Clone()), Pages = Pages.ConvertAll(page => page.Clone()),
Languages = Languages.ConvertAll(language => language.Clone()), Languages = Languages.ConvertAll(language => language.Clone()),
Themes = Themes, Themes = Themes,
Fingerprint = Fingerprint Fingerprint = Fingerprint,
TenantId = TenantId
}; };
} }