refactor TenantDBContext to accomodate AspNetUserPasskeys

This commit is contained in:
sbwalker
2025-10-22 14:06:15 -04:00
parent 39ad5a0638
commit 273097d96d
5 changed files with 102 additions and 12 deletions

View File

@@ -4,7 +4,6 @@ using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.Extensions.Configuration;
@@ -19,7 +18,7 @@ using Oqtane.Shared;
namespace Oqtane.Repository
{
public class DBContextBase : IdentityUserContext<IdentityUser>
public class DBContextBase : DbContext
{
private readonly ITenantManager _tenantManager;
private readonly IHttpContextAccessor _accessor;
@@ -75,8 +74,6 @@ namespace Oqtane.Repository
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
ActiveDatabase.UpdateIdentityStoreTableNames(builder);
}
public override int SaveChanges()

View File

@@ -1,6 +1,19 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
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.Repository.Databases.Interfaces;
using Oqtane.Shared;
// ReSharper disable CheckNamespace
// ReSharper disable MemberCanBePrivate.Global
@@ -8,9 +21,79 @@ using Oqtane.Repository.Databases.Interfaces;
namespace Oqtane.Repository
{
public class TenantDBContext : DBContextBase, IMultiDatabase
public class TenantDBContext : IdentityUserContext<IdentityUser>, IMultiDatabase
{
public TenantDBContext(IDBContextDependencies DBContextDependencies) : base(DBContextDependencies) { }
private readonly ITenantManager _tenantManager;
private readonly IHttpContextAccessor _accessor;
private readonly IConfigurationRoot _config;
private string _connectionString = "";
private string _databaseType = "";
public TenantDBContext(DbContextOptions<TenantDBContext> options, IDBContextDependencies DBContextDependencies) : base(options)
{
_tenantManager = DBContextDependencies.TenantManager;
_accessor = DBContextDependencies.Accessor;
_config = DBContextDependencies.Config;
}
public IDatabase ActiveDatabase { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.ReplaceService<IMigrationsAssembly, MultiDatabaseMigrationsAssembly>();
if (string.IsNullOrEmpty(_connectionString))
{
Tenant tenant = _tenantManager.GetTenant();
if (tenant != null)
{
_connectionString = _config.GetConnectionString(tenant.DBConnectionString);
if (_connectionString != null)
{
_connectionString = _connectionString.Replace($"|{Constants.DataDirectory}|", AppDomain.CurrentDomain.GetData(Constants.DataDirectory)?.ToString());
_databaseType = tenant.DBType;
}
else
{
// tenant connection string does not exist in appsettings.json
}
}
}
if (!string.IsNullOrEmpty(_databaseType))
{
var type = Type.GetType(_databaseType);
ActiveDatabase = Activator.CreateInstance(type) as IDatabase;
}
if (!string.IsNullOrEmpty(_connectionString) && ActiveDatabase != null)
{
optionsBuilder.UseOqtaneDatabase(ActiveDatabase, _connectionString);
}
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
ActiveDatabase.UpdateIdentityStoreTableNames(builder);
}
public override int SaveChanges()
{
DbContextUtils.SaveChanges(this, _accessor);
return base.SaveChanges();
}
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
DbContextUtils.SaveChanges(this, _accessor);
return base.SaveChangesAsync(cancellationToken);
}
public virtual DbSet<Site> Site { get; set; }
public virtual DbSet<Page> Page { get; set; }