use DbContextFactory in SiteRepository

This commit is contained in:
sbwalker 2024-03-06 16:56:27 -05:00
parent 020fa4eefa
commit 1c31c1947c
2 changed files with 20 additions and 12 deletions

View File

@ -44,6 +44,7 @@ namespace Microsoft.Extensions.DependencyInjection
{ {
services.AddDbContext<MasterDBContext>(options => { }, ServiceLifetime.Transient); services.AddDbContext<MasterDBContext>(options => { }, ServiceLifetime.Transient);
services.AddDbContext<TenantDBContext>(options => { }, ServiceLifetime.Transient); services.AddDbContext<TenantDBContext>(options => { }, ServiceLifetime.Transient);
services.AddDbContextFactory<TenantDBContext>(opt => { }, ServiceLifetime.Transient);
return services; return services;
} }
@ -316,7 +317,7 @@ namespace Microsoft.Extensions.DependencyInjection
{ {
if (implementationType.Name == "HtmlTextContext") if (implementationType.Name == "HtmlTextContext")
{ {
services.AddDbContextFactory<Oqtane.Modules.HtmlText.Repository.HtmlTextContext>(opt => { }, ServiceLifetime.Scoped); services.AddDbContextFactory<Oqtane.Modules.HtmlText.Repository.HtmlTextContext>(opt => { }, ServiceLifetime.Transient);
} }
// need a way to call AddDbContextFactory dynamically passing the implementationType // need a way to call AddDbContextFactory dynamically passing the implementationType
//typeof(IServiceCollection) //typeof(IServiceCollection)

View File

@ -18,6 +18,7 @@ namespace Oqtane.Repository
public class SiteRepository : ISiteRepository public class SiteRepository : ISiteRepository
{ {
private readonly TenantDBContext _db; private readonly TenantDBContext _db;
private readonly IDbContextFactory<TenantDBContext> _factory;
private readonly IRoleRepository _roleRepository; private readonly IRoleRepository _roleRepository;
private readonly IProfileRepository _profileRepository; private readonly IProfileRepository _profileRepository;
private readonly IFolderRepository _folderRepository; private readonly IFolderRepository _folderRepository;
@ -32,11 +33,12 @@ namespace Oqtane.Repository
private readonly ILogManager _logger; private readonly ILogManager _logger;
private static readonly object _lock = new object(); private static readonly object _lock = new object();
public SiteRepository(TenantDBContext context, IRoleRepository roleRepository, IProfileRepository profileRepository, IFolderRepository folderRepository, IPageRepository pageRepository, public SiteRepository(TenantDBContext context, IDbContextFactory<TenantDBContext> factory, IRoleRepository roleRepository, IProfileRepository profileRepository, IFolderRepository folderRepository, IPageRepository pageRepository,
IModuleRepository moduleRepository, IPageModuleRepository pageModuleRepository, IModuleDefinitionRepository moduleDefinitionRepository, IThemeRepository themeRepository, IServiceProvider serviceProvider, IModuleRepository moduleRepository, IPageModuleRepository pageModuleRepository, IModuleDefinitionRepository moduleDefinitionRepository, IThemeRepository themeRepository, IServiceProvider serviceProvider,
IConfigurationRoot config, IServerStateManager serverState, ILogManager logger) IConfigurationRoot config, IServerStateManager serverState, ILogManager logger)
{ {
_db = context; _db = context;
_factory = factory;
_roleRepository = roleRepository; _roleRepository = roleRepository;
_profileRepository = profileRepository; _profileRepository = profileRepository;
_folderRepository = folderRepository; _folderRepository = folderRepository;
@ -54,22 +56,25 @@ namespace Oqtane.Repository
// asynchronous methods // asynchronous methods
public async Task<IEnumerable<Site>> GetSitesAsync() public async Task<IEnumerable<Site>> GetSitesAsync()
{ {
return await _db.Site.OrderBy(item => item.Name).ToListAsync(); using var ctx = _factory.CreateDbContext();
return await ctx.Site.OrderBy(item => item.Name).ToListAsync();
} }
public async Task<Site> AddSiteAsync(Site site) public async Task<Site> AddSiteAsync(Site site)
{ {
site.SiteGuid = Guid.NewGuid().ToString(); site.SiteGuid = Guid.NewGuid().ToString();
_db.Site.Add(site); using var ctx = _factory.CreateDbContext();
await _db.SaveChangesAsync(); ctx.Site.Add(site);
await ctx.SaveChangesAsync();
CreateSite(site); CreateSite(site);
return site; return site;
} }
public async Task<Site> UpdateSiteAsync(Site site) public async Task<Site> UpdateSiteAsync(Site site)
{ {
_db.Entry(site).State = EntityState.Modified; using var ctx = _factory.CreateDbContext();
await _db.SaveChangesAsync(); ctx.Entry(site).State = EntityState.Modified;
await ctx.SaveChangesAsync();
return site; return site;
} }
@ -80,21 +85,23 @@ namespace Oqtane.Repository
public async Task<Site> GetSiteAsync(int siteId, bool tracking) public async Task<Site> GetSiteAsync(int siteId, bool tracking)
{ {
using var ctx = _factory.CreateDbContext();
if (tracking) if (tracking)
{ {
return await _db.Site.FindAsync(siteId); return await ctx.Site.FindAsync(siteId);
} }
else else
{ {
return await _db.Site.AsNoTracking().FirstOrDefaultAsync(item => item.SiteId == siteId); return await ctx.Site.AsNoTracking().FirstOrDefaultAsync(item => item.SiteId == siteId);
} }
} }
public async Task DeleteSiteAsync(int siteId) public async Task DeleteSiteAsync(int siteId)
{ {
var site = _db.Site.Find(siteId); using var ctx = _factory.CreateDbContext();
_db.Site.Remove(site); var site = ctx.Site.Find(siteId);
await _db.SaveChangesAsync(); ctx.Site.Remove(site);
await ctx.SaveChangesAsync();
} }
// synchronous methods // synchronous methods