diff --git a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs index 4b4a3b99..84e45bca 100644 --- a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs @@ -44,6 +44,7 @@ namespace Microsoft.Extensions.DependencyInjection { services.AddDbContext(options => { }, ServiceLifetime.Transient); services.AddDbContext(options => { }, ServiceLifetime.Transient); + services.AddDbContextFactory(opt => { }, ServiceLifetime.Transient); return services; } @@ -316,7 +317,7 @@ namespace Microsoft.Extensions.DependencyInjection { if (implementationType.Name == "HtmlTextContext") { - services.AddDbContextFactory(opt => { }, ServiceLifetime.Scoped); + services.AddDbContextFactory(opt => { }, ServiceLifetime.Transient); } // need a way to call AddDbContextFactory dynamically passing the implementationType //typeof(IServiceCollection) diff --git a/Oqtane.Server/Repository/SiteRepository.cs b/Oqtane.Server/Repository/SiteRepository.cs index a37b70e6..4886af28 100644 --- a/Oqtane.Server/Repository/SiteRepository.cs +++ b/Oqtane.Server/Repository/SiteRepository.cs @@ -18,6 +18,7 @@ namespace Oqtane.Repository public class SiteRepository : ISiteRepository { private readonly TenantDBContext _db; + private readonly IDbContextFactory _factory; private readonly IRoleRepository _roleRepository; private readonly IProfileRepository _profileRepository; private readonly IFolderRepository _folderRepository; @@ -32,11 +33,12 @@ namespace Oqtane.Repository private readonly ILogManager _logger; private static readonly object _lock = new object(); - public SiteRepository(TenantDBContext context, IRoleRepository roleRepository, IProfileRepository profileRepository, IFolderRepository folderRepository, IPageRepository pageRepository, + public SiteRepository(TenantDBContext context, IDbContextFactory factory, IRoleRepository roleRepository, IProfileRepository profileRepository, IFolderRepository folderRepository, IPageRepository pageRepository, IModuleRepository moduleRepository, IPageModuleRepository pageModuleRepository, IModuleDefinitionRepository moduleDefinitionRepository, IThemeRepository themeRepository, IServiceProvider serviceProvider, IConfigurationRoot config, IServerStateManager serverState, ILogManager logger) { _db = context; + _factory = factory; _roleRepository = roleRepository; _profileRepository = profileRepository; _folderRepository = folderRepository; @@ -54,22 +56,25 @@ namespace Oqtane.Repository // asynchronous methods public async Task> 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 AddSiteAsync(Site site) { site.SiteGuid = Guid.NewGuid().ToString(); - _db.Site.Add(site); - await _db.SaveChangesAsync(); + using var ctx = _factory.CreateDbContext(); + ctx.Site.Add(site); + await ctx.SaveChangesAsync(); CreateSite(site); return site; } public async Task UpdateSiteAsync(Site site) { - _db.Entry(site).State = EntityState.Modified; - await _db.SaveChangesAsync(); + using var ctx = _factory.CreateDbContext(); + ctx.Entry(site).State = EntityState.Modified; + await ctx.SaveChangesAsync(); return site; } @@ -80,21 +85,23 @@ namespace Oqtane.Repository public async Task GetSiteAsync(int siteId, bool tracking) { + using var ctx = _factory.CreateDbContext(); if (tracking) { - return await _db.Site.FindAsync(siteId); + return await ctx.Site.FindAsync(siteId); } 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) { - var site = _db.Site.Find(siteId); - _db.Site.Remove(site); - await _db.SaveChangesAsync(); + using var ctx = _factory.CreateDbContext(); + var site = ctx.Site.Find(siteId); + ctx.Site.Remove(site); + await ctx.SaveChangesAsync(); } // synchronous methods