From c58254f9513aedc4bbd9a5af0f43ecedbde676f9 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 18 Mar 2024 15:32:19 +0800 Subject: [PATCH] Fix #4010: update repositories to using db context factory. --- Oqtane.Server/Repository/FileRepository.cs | 56 ++++---- Oqtane.Server/Repository/FolderRepository.cs | 42 +++--- .../Repository/LanguageRepository.cs | 34 +++-- Oqtane.Server/Repository/LogRepository.cs | 36 +++--- Oqtane.Server/Repository/ModuleRepository.cs | 32 +++-- .../Repository/NotificationRepository.cs | 54 ++++---- .../Repository/PageModuleRepository.cs | 121 ++++++++---------- Oqtane.Server/Repository/PageRepository.cs | 41 +++--- .../Repository/PermissionRepository.cs | 53 ++++---- Oqtane.Server/Repository/ProfileRepository.cs | 32 +++-- Oqtane.Server/Repository/RoleRepository.cs | 34 +++-- Oqtane.Server/Repository/SettingRepository.cs | 41 +++--- Oqtane.Server/Repository/SiteRepository.cs | 30 +++-- .../Repository/UrlMappingRepository.cs | 38 +++--- Oqtane.Server/Repository/UserRepository.cs | 49 ++++--- .../Repository/UserRoleRepository.cs | 46 ++++--- Oqtane.Server/Repository/VisitorRepository.cs | 44 ++++--- .../Server/Repository/[Module]Repository.cs | 32 +++-- 18 files changed, 460 insertions(+), 355 deletions(-) diff --git a/Oqtane.Server/Repository/FileRepository.cs b/Oqtane.Server/Repository/FileRepository.cs index 829659e1..608426fe 100644 --- a/Oqtane.Server/Repository/FileRepository.cs +++ b/Oqtane.Server/Repository/FileRepository.cs @@ -12,14 +12,16 @@ namespace Oqtane.Repository { public class FileRepository : IFileRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; + private readonly TenantDBContext _queryContext; private readonly IPermissionRepository _permissions; private readonly IFolderRepository _folderRepository; private readonly ITenantManager _tenants; - public FileRepository(TenantDBContext context, IPermissionRepository permissions, IFolderRepository folderRepository, ITenantManager tenants) + public FileRepository(IDbContextFactory dbContextFactory, IPermissionRepository permissions, IFolderRepository folderRepository, ITenantManager tenants) { - _db = context; + _dbContextFactory = dbContextFactory; + _queryContext = dbContextFactory.CreateDbContext(); _permissions = permissions; _folderRepository = folderRepository; _tenants = tenants; @@ -38,12 +40,13 @@ namespace Oqtane.Repository IEnumerable files; if (tracking) { - files = _db.File.Where(item => item.FolderId == folderId).Include(item => item.Folder); + files = _queryContext.File.Where(item => item.FolderId == folderId).Include(item => item.Folder); } else { - files = _db.File.AsNoTracking().Where(item => item.FolderId == folderId).Include(item => item.Folder); + files = _queryContext.File.AsNoTracking().Where(item => item.FolderId == folderId).Include(item => item.Folder); } + foreach (File file in files) { file.Folder.PermissionList = permissions.ToList(); @@ -55,9 +58,9 @@ namespace Oqtane.Repository public File AddFile(File file) { - file.IsDeleted = false; - _db.File.Add(file); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); file.IsDeleted = false; + db.File.Add(file); + db.SaveChanges(); file.Folder = _folderRepository.GetFolder(file.FolderId); file.Url = GetFileUrl(file, _tenants.GetAlias()); return file; @@ -65,8 +68,9 @@ namespace Oqtane.Repository public File UpdateFile(File file) { - _db.Entry(file).State = EntityState.Modified; - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Entry(file).State = EntityState.Modified; + db.SaveChanges(); file.Folder = _folderRepository.GetFolder(file.FolderId); file.Url = GetFileUrl(file, _tenants.GetAlias()); return file; @@ -80,14 +84,14 @@ namespace Oqtane.Repository public File GetFile(int fileId, bool tracking) { - File file; + using var db = _dbContextFactory.CreateDbContext(); File file; if (tracking) { - file = _db.File.Include(item => item.Folder).FirstOrDefault(item => item.FileId == fileId); + file = db.File.Include(item => item.Folder).FirstOrDefault(item => item.FileId == fileId); } else { - file = _db.File.AsNoTracking().Include(item => item.Folder).FirstOrDefault(item => item.FileId == fileId); + file = db.File.AsNoTracking().Include(item => item.Folder).FirstOrDefault(item => item.FileId == fileId); } if (file != null) { @@ -99,10 +103,10 @@ namespace Oqtane.Repository public File GetFile(int folderId, string fileName) { - var file = _db.File.AsNoTracking() - .Include(item => item.Folder) - .FirstOrDefault(item => item.FolderId == folderId && - item.Name.ToLower() == fileName); + using var db = _dbContextFactory.CreateDbContext(); var file = db.File.AsNoTracking() + .Include(item => item.Folder) + .FirstOrDefault(item => item.FolderId == folderId && + item.Name.ToLower() == fileName); if (file != null) { @@ -115,7 +119,8 @@ namespace Oqtane.Repository public File GetFile(int siteId, string folderPath, string fileName) { - var file = _db.File.AsNoTracking() + using var db = _dbContextFactory.CreateDbContext(); + var file = db.File.AsNoTracking() .Include(item => item.Folder) .FirstOrDefault(item => item.Folder.SiteId == siteId && item.Folder.Path.ToLower() == folderPath && @@ -123,7 +128,7 @@ namespace Oqtane.Repository if (file != null) { - IEnumerable permissions = _permissions.GetPermissions(file.Folder.SiteId, EntityNames.Folder, file.FolderId).ToList(); + var permissions = _permissions.GetPermissions(file.Folder.SiteId, EntityNames.Folder, file.FolderId).ToList(); file.Folder.PermissionList = permissions.ToList(); file.Url = GetFileUrl(file, _tenants.GetAlias()); } @@ -133,21 +138,24 @@ namespace Oqtane.Repository public void DeleteFile(int fileId) { - File file = _db.File.Find(fileId); - _db.File.Remove(file); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + var file = db.File.Find(fileId); + db.File.Remove(file); + db.SaveChanges(); } public string GetFilePath(int fileId) { - var file = _db.File.Find(fileId); + using var db = _dbContextFactory.CreateDbContext(); + var file = db.File.Find(fileId); return GetFilePath(file); } public string GetFilePath(File file) { + using var db = _dbContextFactory.CreateDbContext(); if (file == null) return null; - var folder = file.Folder ?? _db.Folder.AsNoTracking().FirstOrDefault(item => item.FolderId == file.FolderId); + var folder = file.Folder ?? db.Folder.AsNoTracking().FirstOrDefault(item => item.FolderId == file.FolderId); var filepath = Path.Combine(_folderRepository.GetFolderPath(folder), file.Name); return filepath; } diff --git a/Oqtane.Server/Repository/FolderRepository.cs b/Oqtane.Server/Repository/FolderRepository.cs index 0c41cc81..a4a1e34e 100644 --- a/Oqtane.Server/Repository/FolderRepository.cs +++ b/Oqtane.Server/Repository/FolderRepository.cs @@ -11,14 +11,16 @@ namespace Oqtane.Repository { public class FolderRepository : IFolderRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; + private readonly TenantDBContext _queryContext; private readonly IPermissionRepository _permissions; private readonly IWebHostEnvironment _environment; private readonly ITenantManager _tenants; - public FolderRepository(TenantDBContext context, IPermissionRepository permissions,IWebHostEnvironment environment, ITenantManager tenants) + public FolderRepository(IDbContextFactory dbContextFactory, IPermissionRepository permissions,IWebHostEnvironment environment, ITenantManager tenants) { - _db = context; + _dbContextFactory = dbContextFactory; + _queryContext = _dbContextFactory.CreateDbContext(); _permissions = permissions; _environment = environment; _tenants = tenants; @@ -26,9 +28,9 @@ namespace Oqtane.Repository public IEnumerable GetFolders(int siteId) { - IEnumerable permissions = _permissions.GetPermissions(siteId, EntityNames.Folder).ToList(); - IEnumerable folders = _db.Folder.Where(item => item.SiteId == siteId); - foreach(Folder folder in folders) + var permissions = _permissions.GetPermissions(siteId, EntityNames.Folder).ToList(); + var folders = _queryContext.Folder.Where(item => item.SiteId == siteId); + foreach (var folder in folders) { folder.PermissionList = permissions.Where(item => item.EntityId == folder.FolderId).ToList(); } @@ -37,17 +39,19 @@ namespace Oqtane.Repository public Folder AddFolder(Folder folder) { + using var db = _dbContextFactory.CreateDbContext(); folder.IsDeleted = false; - _db.Folder.Add(folder); - _db.SaveChanges(); + db.Folder.Add(folder); + db.SaveChanges(); _permissions.UpdatePermissions(folder.SiteId, EntityNames.Folder, folder.FolderId, folder.PermissionList); return folder; } public Folder UpdateFolder(Folder folder) { - _db.Entry(folder).State = EntityState.Modified; - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Entry(folder).State = EntityState.Modified; + db.SaveChanges(); _permissions.UpdatePermissions(folder.SiteId, EntityNames.Folder, folder.FolderId, folder.PermissionList); return folder; } @@ -59,14 +63,15 @@ namespace Oqtane.Repository public Folder GetFolder(int folderId, bool tracking) { + using var db = _dbContextFactory.CreateDbContext(); Folder folder; if (tracking) { - folder = _db.Folder.Find(folderId); + folder = db.Folder.Find(folderId); } else { - folder = _db.Folder.AsNoTracking().Where(item => item.FolderId == folderId).FirstOrDefault(); + folder = db.Folder.AsNoTracking().Where(item => item.FolderId == folderId).FirstOrDefault(); } if (folder != null) { @@ -77,7 +82,8 @@ namespace Oqtane.Repository public Folder GetFolder(int siteId, string path) { - Folder folder = _db.Folder.Where(item => item.SiteId == siteId && item.Path == path).FirstOrDefault(); + using var db = _dbContextFactory.CreateDbContext(); + var folder = db.Folder.Where(item => item.SiteId == siteId && item.Path == path).FirstOrDefault(); if (folder != null) { folder.PermissionList = _permissions.GetPermissions(folder.SiteId, EntityNames.Folder, folder.FolderId)?.ToList(); @@ -87,15 +93,17 @@ namespace Oqtane.Repository public void DeleteFolder(int folderId) { - Folder folder = _db.Folder.Find(folderId); + using var db = _dbContextFactory.CreateDbContext(); + var folder = db.Folder.Find(folderId); _permissions.DeletePermissions(folder.SiteId, EntityNames.Folder, folderId); - _db.Folder.Remove(folder); - _db.SaveChanges(); + db.Folder.Remove(folder); + db.SaveChanges(); } public string GetFolderPath(int folderId) { - Folder folder = _db.Folder.Find(folderId); + using var db = _dbContextFactory.CreateDbContext(); + var folder = db.Folder.Find(folderId); return GetFolderPath(folder); } diff --git a/Oqtane.Server/Repository/LanguageRepository.cs b/Oqtane.Server/Repository/LanguageRepository.cs index 80dc01ad..7ff1a865 100644 --- a/Oqtane.Server/Repository/LanguageRepository.cs +++ b/Oqtane.Server/Repository/LanguageRepository.cs @@ -7,64 +7,70 @@ namespace Oqtane.Repository { public class LanguageRepository : ILanguageRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; + private readonly TenantDBContext _queryContext; - public LanguageRepository(TenantDBContext context) + public LanguageRepository(IDbContextFactory dbContextFactory) { - _db = context; + _dbContextFactory = dbContextFactory; + _queryContext = _dbContextFactory.CreateDbContext(); } public IEnumerable GetLanguages(int siteId) { - return _db.Language.Where(l => l.SiteId == siteId); + return _queryContext.Language.Where(l => l.SiteId == siteId); } public Language AddLanguage(Language language) { + using var db = _dbContextFactory.CreateDbContext(); if (language.IsDefault) { // Ensure all other languages are not set to default - _db.Language + db.Language .Where(l => l.SiteId == language.SiteId) .ToList() .ForEach(l => l.IsDefault = false); } - _db.Language.Add(language); - _db.SaveChanges(); + db.Language.Add(language); + db.SaveChanges(); return language; } public void UpdateLanguage(Language language) { + using var db = _dbContextFactory.CreateDbContext(); if (language.LanguageId != 0) { - _db.Entry(language).State = EntityState.Modified; + db.Entry(language).State = EntityState.Modified; } if (language.IsDefault) { // Ensure all other languages are not set to default - _db.Language + db.Language .Where(l => l.SiteId == language.SiteId && l.LanguageId != language.LanguageId) .ToList() .ForEach(l => l.IsDefault = false); } - _db.SaveChanges(); + db.SaveChanges(); } public Language GetLanguage(int languageId) { - return _db.Language.Find(languageId); + using var db = _dbContextFactory.CreateDbContext(); + return db.Language.Find(languageId); } public void DeleteLanguage(int languageId) { - var language = _db.Language.Find(languageId); - _db.Language.Remove(language); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + var language = db.Language.Find(languageId); + db.Language.Remove(language); + db.SaveChanges(); } } } diff --git a/Oqtane.Server/Repository/LogRepository.cs b/Oqtane.Server/Repository/LogRepository.cs index 8f8363ac..95fe0ced 100644 --- a/Oqtane.Server/Repository/LogRepository.cs +++ b/Oqtane.Server/Repository/LogRepository.cs @@ -1,17 +1,20 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.EntityFrameworkCore; using Oqtane.Models; namespace Oqtane.Repository { public class LogRepository : ILogRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; + private readonly TenantDBContext _queryContext; - public LogRepository(TenantDBContext context) + public LogRepository(IDbContextFactory dbContextFactory) { - _db = context; + _dbContextFactory = dbContextFactory; + _queryContext = _dbContextFactory.CreateDbContext(); } public IEnumerable GetLogs(int siteId, string level, string function, int rows) @@ -20,48 +23,51 @@ namespace Oqtane.Repository { if (function == null) { - return _db.Log.Where(item => item.SiteId == siteId). + return _queryContext.Log.Where(item => item.SiteId == siteId). OrderByDescending(item => item.LogDate).Take(rows); } - return _db.Log.Where(item => item.SiteId == siteId && item.Function == function). + return _queryContext.Log.Where(item => item.SiteId == siteId && item.Function == function). OrderByDescending(item => item.LogDate).Take(rows); } if (function == null) { - return _db.Log.Where(item => item.SiteId == siteId && item.Level == level) + return _queryContext.Log.Where(item => item.SiteId == siteId && item.Level == level) .OrderByDescending(item => item.LogDate).Take(rows); } - return _db.Log.Where(item => item.SiteId == siteId && item.Level == level && item.Function == function) + return _queryContext.Log.Where(item => item.SiteId == siteId && item.Level == level && item.Function == function) .OrderByDescending(item => item.LogDate).Take(rows); } public Log GetLog(int logId) { - return _db.Log.Find(logId); + using var db = _dbContextFactory.CreateDbContext(); + return db.Log.Find(logId); } public void AddLog(Log log) { - _db.Log.Add(log); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Log.Add(log); + db.SaveChanges(); } public int DeleteLogs(int siteId, int age) { + using var db = _dbContextFactory.CreateDbContext(); // delete logs in batches of 100 records - int count = 0; + var count = 0; var purgedate = DateTime.UtcNow.AddDays(-age); - var logs = _db.Log.Where(item => item.SiteId == siteId && item.Level != "Error" && item.LogDate < purgedate) + var logs = db.Log.Where(item => item.SiteId == siteId && item.Level != "Error" && item.LogDate < purgedate) .OrderBy(item => item.LogDate).Take(100).ToList(); while (logs.Count > 0) { count += logs.Count; - _db.Log.RemoveRange(logs); - _db.SaveChanges(); - logs = _db.Log.Where(item => item.SiteId == siteId && item.Level != "Error" && item.LogDate < purgedate) + db.Log.RemoveRange(logs); + db.SaveChanges(); + logs = db.Log.Where(item => item.SiteId == siteId && item.Level != "Error" && item.LogDate < purgedate) .OrderBy(item => item.LogDate).Take(100).ToList(); } return count; diff --git a/Oqtane.Server/Repository/ModuleRepository.cs b/Oqtane.Server/Repository/ModuleRepository.cs index 68095740..325ae8a0 100644 --- a/Oqtane.Server/Repository/ModuleRepository.cs +++ b/Oqtane.Server/Repository/ModuleRepository.cs @@ -14,15 +14,17 @@ namespace Oqtane.Repository { public class ModuleRepository : IModuleRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; + private readonly TenantDBContext _queryContext; private readonly IPermissionRepository _permissions; private readonly ISettingRepository _settings; private readonly IModuleDefinitionRepository _moduleDefinitions; private readonly IServiceProvider _serviceProvider; - public ModuleRepository(TenantDBContext context, IPermissionRepository permissions, ISettingRepository settings, IModuleDefinitionRepository moduleDefinitions, IServiceProvider serviceProvider) + public ModuleRepository(IDbContextFactory dbContextFactory, IPermissionRepository permissions, ISettingRepository settings, IModuleDefinitionRepository moduleDefinitions, IServiceProvider serviceProvider) { - _db = context; + _dbContextFactory = dbContextFactory; + _queryContext = _dbContextFactory.CreateDbContext(); _permissions = permissions; _settings = settings; _moduleDefinitions = moduleDefinitions; @@ -31,21 +33,23 @@ namespace Oqtane.Repository public IEnumerable GetModules(int siteId) { - return _db.Module.Where(item => item.SiteId == siteId).ToList(); + return _queryContext.Module.Where(item => item.SiteId == siteId); } public Module AddModule(Module module) { - _db.Module.Add(module); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Module.Add(module); + db.SaveChanges(); _permissions.UpdatePermissions(module.SiteId, EntityNames.Module, module.ModuleId, module.PermissionList); return module; } public Module UpdateModule(Module module) { - _db.Entry(module).State = EntityState.Modified; - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Entry(module).State = EntityState.Modified; + db.SaveChanges(); _permissions.UpdatePermissions(module.SiteId, EntityNames.Module, module.ModuleId, module.PermissionList); return module; } @@ -57,14 +61,15 @@ namespace Oqtane.Repository public Module GetModule(int moduleId, bool tracking) { + using var db = _dbContextFactory.CreateDbContext(); Module module; if (tracking) { - module = _db.Module.Find(moduleId); + module = db.Module.Find(moduleId); } else { - module = _db.Module.AsNoTracking().FirstOrDefault(item => item.ModuleId == moduleId); + module = db.Module.AsNoTracking().FirstOrDefault(item => item.ModuleId == moduleId); } if (module != null) { @@ -75,11 +80,12 @@ namespace Oqtane.Repository public void DeleteModule(int moduleId) { - Module module = _db.Module.Find(moduleId); + using var db = _dbContextFactory.CreateDbContext(); + var module = db.Module.Find(moduleId); _permissions.DeletePermissions(module.SiteId, EntityNames.Module, moduleId); _settings.DeleteSettings(EntityNames.Module, moduleId); - _db.Module.Remove(module); - _db.SaveChanges(); + db.Module.Remove(module); + db.SaveChanges(); } public string ExportModule(int moduleId) diff --git a/Oqtane.Server/Repository/NotificationRepository.cs b/Oqtane.Server/Repository/NotificationRepository.cs index 43f9b386..b4603f29 100644 --- a/Oqtane.Server/Repository/NotificationRepository.cs +++ b/Oqtane.Server/Repository/NotificationRepository.cs @@ -8,25 +8,26 @@ namespace Oqtane.Repository { public class NotificationRepository : INotificationRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; - public NotificationRepository(TenantDBContext context) + public NotificationRepository(IDbContextFactory dbContextFactory) { - _db = context; + _dbContextFactory = dbContextFactory; } public IEnumerable GetNotifications(int siteId, int fromUserId, int toUserId) { + using var db = _dbContextFactory.CreateDbContext(); if (toUserId == -1 && fromUserId == -1) { - return _db.Notification + return db.Notification .Where(item => item.SiteId == siteId) .Where(item => item.IsDelivered == false && item.IsDeleted == false) .Where(item => item.SendOn == null || item.SendOn < System.DateTime.UtcNow) .ToList(); } - return _db.Notification + return db.Notification .Where(item => item.SiteId == siteId) .Where(item => item.ToUserId == toUserId || toUserId == -1) .Where(item => item.FromUserId == fromUserId || fromUserId == -1) @@ -35,9 +36,10 @@ namespace Oqtane.Repository public IEnumerable GetNotifications(int siteId, int fromUserId, int toUserId, int count, bool isRead) { + using var db = _dbContextFactory.CreateDbContext(); if (toUserId == -1 && fromUserId == -1) { - return _db.Notification + return db.Notification .Where(item => item.SiteId == siteId) .Where(item => item.IsDelivered == false && item.IsDeleted == false) .Where(item => item.SendOn == null || item.SendOn < System.DateTime.UtcNow) @@ -47,7 +49,7 @@ namespace Oqtane.Repository .Take(count); } - return _db.Notification + return db.Notification .Where(item => item.SiteId == siteId) .Where(item => item.ToUserId == toUserId || toUserId == -1) .Where(item => item.FromUserId == fromUserId || fromUserId == -1) @@ -59,9 +61,10 @@ namespace Oqtane.Repository public int GetNotificationCount(int siteId, int fromUserId, int toUserId, bool isRead) { + using var db = _dbContextFactory.CreateDbContext(); if (toUserId == -1 && fromUserId == -1) { - return _db.Notification + return db.Notification .Where(item => item.SiteId == siteId) .Where(item => item.IsDelivered == false && item.IsDeleted == false) .Where(item => item.SendOn == null || item.SendOn < System.DateTime.UtcNow) @@ -71,7 +74,7 @@ namespace Oqtane.Repository } - return _db.Notification + return db.Notification .Where(item => item.SiteId == siteId) .Where(item => item.ToUserId == toUserId || toUserId == -1) .Where(item => item.FromUserId == fromUserId || fromUserId == -1) @@ -83,15 +86,17 @@ namespace Oqtane.Repository public Notification AddNotification(Notification notification) { - _db.Notification.Add(notification); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Notification.Add(notification); + db.SaveChanges(); return notification; } public Notification UpdateNotification(Notification notification) { - _db.Entry(notification).State = EntityState.Modified; - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Entry(notification).State = EntityState.Modified; + db.SaveChanges(); return notification; } public Notification GetNotification(int notificationId) @@ -101,36 +106,39 @@ namespace Oqtane.Repository public Notification GetNotification(int notificationId, bool tracking) { + using var db = _dbContextFactory.CreateDbContext(); if (tracking) { - return _db.Notification.Find(notificationId); + return db.Notification.Find(notificationId); } else { - return _db.Notification.AsNoTracking().FirstOrDefault(item => item.NotificationId == notificationId); + return db.Notification.AsNoTracking().FirstOrDefault(item => item.NotificationId == notificationId); } } public void DeleteNotification(int notificationId) { - Notification notification = _db.Notification.Find(notificationId); - _db.Notification.Remove(notification); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + var notification = db.Notification.Find(notificationId); + db.Notification.Remove(notification); + db.SaveChanges(); } public int DeleteNotifications(int siteId, int age) { + using var db = _dbContextFactory.CreateDbContext(); // delete notifications in batches of 100 records - int count = 0; + var count = 0; var purgedate = DateTime.UtcNow.AddDays(-age); - var notifications = _db.Notification.Where(item => item.SiteId == siteId && item.FromUserId == null && item.IsDelivered && item.DeliveredOn < purgedate) + var notifications = db.Notification.Where(item => item.SiteId == siteId && item.FromUserId == null && item.IsDelivered && item.DeliveredOn < purgedate) .OrderBy(item => item.DeliveredOn).Take(100).ToList(); while (notifications.Count > 0) { count += notifications.Count; - _db.Notification.RemoveRange(notifications); - _db.SaveChanges(); - notifications = _db.Notification.Where(item => item.SiteId == siteId && item.FromUserId == null && item.IsDelivered && item.DeliveredOn < purgedate) + db.Notification.RemoveRange(notifications); + db.SaveChanges(); + notifications = db.Notification.Where(item => item.SiteId == siteId && item.FromUserId == null && item.IsDelivered && item.DeliveredOn < purgedate) .OrderBy(item => item.DeliveredOn).Take(100).ToList(); } return count; diff --git a/Oqtane.Server/Repository/PageModuleRepository.cs b/Oqtane.Server/Repository/PageModuleRepository.cs index 69ac45d0..bc24ffa8 100644 --- a/Oqtane.Server/Repository/PageModuleRepository.cs +++ b/Oqtane.Server/Repository/PageModuleRepository.cs @@ -23,47 +23,40 @@ namespace Oqtane.Repository _modules = modules; _permissions = permissions; _settings = settings; - } + } - public IEnumerable GetPageModules(int siteId) + public IEnumerable GetPageModules(int siteId) { - using(var db = _dbContextFactory.CreateDbContext()) - { - var pagemodules = db.PageModule + using var db = _dbContextFactory.CreateDbContext(); + var pagemodules = db.PageModule .Include(item => item.Module) // eager load modules .Where(item => item.Module.SiteId == siteId).ToList(); - if (pagemodules.Any()) + if (pagemodules.Any()) + { + var moduledefinitions = _moduleDefinitions.GetModuleDefinitions(siteId).ToList(); + var permissions = _permissions.GetPermissions(siteId, EntityNames.Module).ToList(); + for (int index = 0; index < pagemodules.Count; index++) { - var moduledefinitions = _moduleDefinitions.GetModuleDefinitions(siteId).ToList(); - var permissions = _permissions.GetPermissions(siteId, EntityNames.Module).ToList(); - for (int index = 0; index < pagemodules.Count; index++) - { - pagemodules[index] = GetPageModule(pagemodules[index], moduledefinitions, permissions); - } + pagemodules[index] = GetPageModule(pagemodules[index], moduledefinitions, permissions); } - return pagemodules; } - + return pagemodules; } public PageModule AddPageModule(PageModule pageModule) { - using (var db = _dbContextFactory.CreateDbContext()) - { - db.PageModule.Add(pageModule); - db.SaveChanges(); - return pageModule; - } + using var db = _dbContextFactory.CreateDbContext(); + db.PageModule.Add(pageModule); + db.SaveChanges(); + return pageModule; } public PageModule UpdatePageModule(PageModule pageModule) { - using (var db = _dbContextFactory.CreateDbContext()) - { - db.Entry(pageModule).State = EntityState.Modified; - db.SaveChanges(); - return pageModule; - } + using var db = _dbContextFactory.CreateDbContext(); + db.Entry(pageModule).State = EntityState.Modified; + db.SaveChanges(); + return pageModule; } public PageModule GetPageModule(int pageModuleId) @@ -73,61 +66,55 @@ namespace Oqtane.Repository public PageModule GetPageModule(int pageModuleId, bool tracking) { - using (var db = _dbContextFactory.CreateDbContext()) + using var db = _dbContextFactory.CreateDbContext(); + PageModule pagemodule; + if (tracking) { - PageModule pagemodule; - if (tracking) - { - pagemodule = db.PageModule.Include(item => item.Module) // eager load modules - .FirstOrDefault(item => item.PageModuleId == pageModuleId); - } - else - { - pagemodule = db.PageModule.AsNoTracking().Include(item => item.Module) // eager load modules - .FirstOrDefault(item => item.PageModuleId == pageModuleId); - } - if (pagemodule != null) - { - var moduledefinitions = _moduleDefinitions.GetModuleDefinitions(pagemodule.Module.SiteId).ToList(); - var permissions = _permissions.GetPermissions(pagemodule.Module.SiteId, EntityNames.Module).ToList(); - pagemodule = GetPageModule(pagemodule, moduledefinitions, permissions); - } - return pagemodule; + pagemodule = db.PageModule.Include(item => item.Module) // eager load modules + .FirstOrDefault(item => item.PageModuleId == pageModuleId); } + else + { + pagemodule = db.PageModule.AsNoTracking().Include(item => item.Module) // eager load modules + .FirstOrDefault(item => item.PageModuleId == pageModuleId); + } + if (pagemodule != null) + { + var moduledefinitions = _moduleDefinitions.GetModuleDefinitions(pagemodule.Module.SiteId).ToList(); + var permissions = _permissions.GetPermissions(pagemodule.Module.SiteId, EntityNames.Module).ToList(); + pagemodule = GetPageModule(pagemodule, moduledefinitions, permissions); + } + return pagemodule; } public PageModule GetPageModule(int pageId, int moduleId) { - using (var db = _dbContextFactory.CreateDbContext()) - { - PageModule pagemodule = db.PageModule.Include(item => item.Module) // eager load modules + using var db = _dbContextFactory.CreateDbContext(); + var pagemodule = db.PageModule.Include(item => item.Module) // eager load modules .SingleOrDefault(item => item.PageId == pageId && item.ModuleId == moduleId); - if (pagemodule != null) - { - var moduledefinitions = _moduleDefinitions.GetModuleDefinitions(pagemodule.Module.SiteId).ToList(); - var permissions = _permissions.GetPermissions(pagemodule.Module.SiteId, EntityNames.Module).ToList(); - pagemodule = GetPageModule(pagemodule, moduledefinitions, permissions); - } - return pagemodule; + if (pagemodule != null) + { + var moduledefinitions = _moduleDefinitions.GetModuleDefinitions(pagemodule.Module.SiteId).ToList(); + var permissions = _permissions.GetPermissions(pagemodule.Module.SiteId, EntityNames.Module).ToList(); + pagemodule = GetPageModule(pagemodule, moduledefinitions, permissions); } + return pagemodule; } public void DeletePageModule(int pageModuleId) { - using (var db = _dbContextFactory.CreateDbContext()) - { - PageModule pageModule = db.PageModule.Include(item => item.Module) // eager load modules + using var db = _dbContextFactory.CreateDbContext(); + var pageModule = db.PageModule.Include(item => item.Module) // eager load modules .SingleOrDefault(item => item.PageModuleId == pageModuleId); - _settings.DeleteSettings(EntityNames.PageModule, pageModuleId); - db.PageModule.Remove(pageModule); - db.SaveChanges(); + _settings.DeleteSettings(EntityNames.PageModule, pageModuleId); + db.PageModule.Remove(pageModule); + db.SaveChanges(); - // check if there are any remaining module instances in the site - var pageModules = GetPageModules(pageModule.Module.SiteId); - if (!pageModules.Any(item => item.ModuleId == pageModule.ModuleId)) - { - _modules.DeleteModule(pageModule.ModuleId); - } + // check if there are any remaining module instances in the site + var pageModules = GetPageModules(pageModule.Module.SiteId); + if (!pageModules.Any(item => item.ModuleId == pageModule.ModuleId)) + { + _modules.DeleteModule(pageModule.ModuleId); } } diff --git a/Oqtane.Server/Repository/PageRepository.cs b/Oqtane.Server/Repository/PageRepository.cs index d454bfe0..2760bceb 100644 --- a/Oqtane.Server/Repository/PageRepository.cs +++ b/Oqtane.Server/Repository/PageRepository.cs @@ -9,14 +9,16 @@ namespace Oqtane.Repository { public class PageRepository : IPageRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; + private readonly TenantDBContext _queryContext; private readonly IPageModuleRepository _pageModules; private readonly IPermissionRepository _permissions; private readonly ISettingRepository _settings; - public PageRepository(TenantDBContext context, IPageModuleRepository pageModules, IPermissionRepository permissions, ISettingRepository settings) + public PageRepository(IDbContextFactory dbContextFactory, IPageModuleRepository pageModules, IPermissionRepository permissions, ISettingRepository settings) { - _db = context; + _dbContextFactory = dbContextFactory; + _queryContext = _dbContextFactory.CreateDbContext(); _pageModules = pageModules; _permissions = permissions; _settings = settings; @@ -24,9 +26,9 @@ namespace Oqtane.Repository public IEnumerable GetPages(int siteId) { - IEnumerable permissions = _permissions.GetPermissions(siteId, EntityNames.Page).ToList(); - IEnumerable pages = _db.Page.Where(item => item.SiteId == siteId && item.UserId == null); - foreach(Page page in pages) + var permissions = _permissions.GetPermissions(siteId, EntityNames.Page).ToList(); + var pages = _queryContext.Page.Where(item => item.SiteId == siteId && item.UserId == null); + foreach (var page in pages) { page.PermissionList = permissions.Where(item => item.EntityId == page.PageId).ToList(); } @@ -35,16 +37,18 @@ namespace Oqtane.Repository public Page AddPage(Page page) { - _db.Page.Add(page); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Page.Add(page); + db.SaveChanges(); _permissions.UpdatePermissions(page.SiteId, EntityNames.Page, page.PageId, page.PermissionList); return page; } public Page UpdatePage(Page page) { - _db.Entry(page).State = EntityState.Modified; - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Entry(page).State = EntityState.Modified; + db.SaveChanges(); _permissions.UpdatePermissions(page.SiteId, EntityNames.Page, page.PageId, page.PermissionList); return page; } @@ -56,15 +60,16 @@ namespace Oqtane.Repository public Page GetPage(int pageId, bool tracking) { + using var db = _dbContextFactory.CreateDbContext(); Page page; if (tracking) { - page = _db.Page.Find(pageId); + page = db.Page.Find(pageId); } else { - page = _db.Page.AsNoTracking().FirstOrDefault(item => item.PageId == pageId); + page = db.Page.AsNoTracking().FirstOrDefault(item => item.PageId == pageId); } if (page != null) { @@ -75,7 +80,8 @@ namespace Oqtane.Repository public Page GetPage(string path, int siteId) { - Page page = _db.Page.FirstOrDefault(item => item.Path == path && item.SiteId == siteId); + using var db = _dbContextFactory.CreateDbContext(); + var page = db.Page.FirstOrDefault(item => item.Path == path && item.SiteId == siteId); if (page != null) { page.PermissionList = _permissions.GetPermissions(page.SiteId, EntityNames.Page, page.PageId)?.ToList(); @@ -85,18 +91,19 @@ namespace Oqtane.Repository public void DeletePage(int pageId) { - Page page = _db.Page.Find(pageId); + using var db = _dbContextFactory.CreateDbContext(); + var page = db.Page.Find(pageId); _permissions.DeletePermissions(page.SiteId, EntityNames.Page, pageId); _settings.DeleteSettings(EntityNames.Page, pageId); // remove page modules for page - var pageModules = _db.PageModule.Where(item => item.PageId == pageId).ToList(); + var pageModules = db.PageModule.Where(item => item.PageId == pageId).ToList(); foreach (var pageModule in pageModules) { _pageModules.DeletePageModule(pageModule.PageModuleId); } // must occur after page modules are deleted because of cascading delete relationship - _db.Page.Remove(page); - _db.SaveChanges(); + db.Page.Remove(page); + db.SaveChanges(); } } } diff --git a/Oqtane.Server/Repository/PermissionRepository.cs b/Oqtane.Server/Repository/PermissionRepository.cs index ba26537c..7d82ded9 100644 --- a/Oqtane.Server/Repository/PermissionRepository.cs +++ b/Oqtane.Server/Repository/PermissionRepository.cs @@ -10,14 +10,14 @@ namespace Oqtane.Repository { public class PermissionRepository : IPermissionRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; private readonly IRoleRepository _roles; private readonly IMemoryCache _cache; private readonly SiteState _siteState; - public PermissionRepository(TenantDBContext context, IRoleRepository roles, IMemoryCache cache, SiteState siteState) + public PermissionRepository(IDbContextFactory dbContextFactory, IRoleRepository roles, IMemoryCache cache, SiteState siteState) { - _db = context; + _dbContextFactory = dbContextFactory; _roles = roles; _cache = cache; _siteState = siteState; @@ -25,13 +25,14 @@ namespace Oqtane.Repository public IEnumerable GetPermissions(int siteId, string entityName) { + using var db = _dbContextFactory.CreateDbContext(); var alias = _siteState?.Alias; if (alias != null) { return _cache.GetOrCreate($"permissions:{alias.TenantId}:{siteId}:{entityName}", entry => { var roles = _roles.GetRoles(siteId, true).ToList(); - var permissions = _db.Permission.Where(item => item.SiteId == siteId).Where(item => item.EntityName == entityName).ToList(); + var permissions = db.Permission.Where(item => item.SiteId == siteId).Where(item => item.EntityName == entityName).ToList(); foreach (var permission in permissions) { if (permission.RoleId != null && string.IsNullOrEmpty(permission.RoleName)) @@ -69,24 +70,27 @@ namespace Oqtane.Repository public Permission AddPermission(Permission permission) { - _db.Permission.Add(permission); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Permission.Add(permission); + db.SaveChanges(); ClearCache(permission.SiteId, permission.EntityName); return permission; } public Permission UpdatePermission(Permission permission) { - _db.Entry(permission).State = EntityState.Modified; - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Entry(permission).State = EntityState.Modified; + db.SaveChanges(); ClearCache(permission.SiteId, permission.EntityName); return permission; } public void UpdatePermissions(int siteId, string entityName, int entityId, List permissions) { + using var db = _dbContextFactory.CreateDbContext(); // ensure permissions are fully populated - List roles = _roles.GetRoles(siteId, true).ToList(); + var roles = _roles.GetRoles(siteId, true).ToList(); foreach (var permission in permissions) { permission.SiteId = siteId; @@ -115,13 +119,13 @@ namespace Oqtane.Repository if (current.IsAuthorized != permission.IsAuthorized) { current.IsAuthorized = permission.IsAuthorized; - _db.Entry(current).State = EntityState.Modified; + db.Entry(current).State = EntityState.Modified; modified = true; } } else { - _db.Permission.Add(permission); + db.Permission.Add(permission); modified = true; } } @@ -131,13 +135,13 @@ namespace Oqtane.Repository if (!permissions.Any(item => item.EntityName == permission.EntityName && item.PermissionName == permission.PermissionName && item.EntityId == permission.EntityId && item.RoleId == permission.RoleId && item.UserId == permission.UserId)) { - _db.Permission.Remove(permission); + db.Permission.Remove(permission); modified = true; } } if (modified) { - _db.SaveChanges(); + db.SaveChanges(); foreach (var entityname in permissions.Select(item => item.EntityName).Distinct()) { ClearCache(siteId, entityname); @@ -147,28 +151,31 @@ namespace Oqtane.Repository public Permission GetPermission(int permissionId) { - return _db.Permission.Find(permissionId); + using var db = _dbContextFactory.CreateDbContext(); + return db.Permission.Find(permissionId); } public void DeletePermission(int permissionId) { - Permission permission = _db.Permission.Find(permissionId); - _db.Permission.Remove(permission); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + var permission = db.Permission.Find(permissionId); + db.Permission.Remove(permission); + db.SaveChanges(); ClearCache(permission.SiteId, permission.EntityName); } public void DeletePermissions(int siteId, string entityName, int entityId) { - IEnumerable permissions = _db.Permission - .Where(item => item.EntityName == entityName) - .Where(item => item.EntityId == entityId) - .Where(item => item.SiteId == siteId); + using var db = _dbContextFactory.CreateDbContext(); + var permissions = db.Permission + .Where(item => item.EntityName == entityName) + .Where(item => item.EntityId == entityId) + .Where(item => item.SiteId == siteId); foreach (Permission permission in permissions) { - _db.Permission.Remove(permission); + db.Permission.Remove(permission); } - _db.SaveChanges(); + db.SaveChanges(); ClearCache(siteId, entityName); } diff --git a/Oqtane.Server/Repository/ProfileRepository.cs b/Oqtane.Server/Repository/ProfileRepository.cs index 3109fa3c..9e067b30 100644 --- a/Oqtane.Server/Repository/ProfileRepository.cs +++ b/Oqtane.Server/Repository/ProfileRepository.cs @@ -7,29 +7,33 @@ namespace Oqtane.Repository { public class ProfileRepository : IProfileRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; + private readonly TenantDBContext _queryContext; - public ProfileRepository(TenantDBContext context) + public ProfileRepository(IDbContextFactory dbContextFactory) { - _db = context; + _dbContextFactory = dbContextFactory; + _queryContext = _dbContextFactory.CreateDbContext(); } public IEnumerable GetProfiles(int siteId) { - return _db.Profile.Where(item => item.SiteId == siteId || item.SiteId == null); + return _queryContext.Profile.Where(item => item.SiteId == siteId || item.SiteId == null); } public Profile AddProfile(Profile profile) { - _db.Profile.Add(profile); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Profile.Add(profile); + db.SaveChanges(); return profile; } public Profile UpdateProfile(Profile profile) { - _db.Entry(profile).State = EntityState.Modified; - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Entry(profile).State = EntityState.Modified; + db.SaveChanges(); return profile; } @@ -40,21 +44,23 @@ namespace Oqtane.Repository public Profile GetProfile(int profileId, bool tracking) { + using var db = _dbContextFactory.CreateDbContext(); if (tracking) { - return _db.Profile.Find(profileId); + return db.Profile.Find(profileId); } else { - return _db.Profile.AsNoTracking().FirstOrDefault(item => item.ProfileId == profileId); + return db.Profile.AsNoTracking().FirstOrDefault(item => item.ProfileId == profileId); } } public void DeleteProfile(int profileId) { - Profile profile = _db.Profile.Find(profileId); - _db.Profile.Remove(profile); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + var profile = db.Profile.Find(profileId); + db.Profile.Remove(profile); + db.SaveChanges(); } } } diff --git a/Oqtane.Server/Repository/RoleRepository.cs b/Oqtane.Server/Repository/RoleRepository.cs index c50ead27..575356df 100644 --- a/Oqtane.Server/Repository/RoleRepository.cs +++ b/Oqtane.Server/Repository/RoleRepository.cs @@ -7,11 +7,13 @@ namespace Oqtane.Repository { public class RoleRepository : IRoleRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; + private readonly TenantDBContext _queryContext; - public RoleRepository(TenantDBContext context) + public RoleRepository(IDbContextFactory dbContextFactory) { - _db = context; + _dbContextFactory = dbContextFactory; + _queryContext = _dbContextFactory.CreateDbContext(); } public IEnumerable GetRoles(int siteId) @@ -23,27 +25,29 @@ namespace Oqtane.Repository { if (includeGlobalRoles) { - return _db.Role.Where(item => item.SiteId == siteId || item.SiteId == null); + return _queryContext.Role.Where(item => item.SiteId == siteId || item.SiteId == null); } else { - return _db.Role.Where(item => item.SiteId == siteId); + return _queryContext.Role.Where(item => item.SiteId == siteId); } } public Role AddRole(Role role) { + using var db = _dbContextFactory.CreateDbContext(); role.Description = role.Description.Substring(0, (role.Description.Length > 256) ? 256 : role.Description.Length); - _db.Role.Add(role); - _db.SaveChanges(); + db.Role.Add(role); + db.SaveChanges(); return role; } public Role UpdateRole(Role role) { + using var db = _dbContextFactory.CreateDbContext(); role.Description = role.Description.Substring(0, (role.Description.Length > 256) ? 256 : role.Description.Length); - _db.Entry(role).State = EntityState.Modified; - _db.SaveChanges(); + db.Entry(role).State = EntityState.Modified; + db.SaveChanges(); return role; } @@ -54,21 +58,23 @@ namespace Oqtane.Repository public Role GetRole(int roleId, bool tracking) { + using var db = _dbContextFactory.CreateDbContext(); if (tracking) { - return _db.Role.Find(roleId); + return db.Role.Find(roleId); } else { - return _db.Role.AsNoTracking().FirstOrDefault(item => item.RoleId == roleId); + return db.Role.AsNoTracking().FirstOrDefault(item => item.RoleId == roleId); } } public void DeleteRole(int roleId) { - Role role = _db.Role.Find(roleId); - _db.Role.Remove(role); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + Role role = db.Role.Find(roleId); + db.Role.Remove(role); + db.SaveChanges(); } } } diff --git a/Oqtane.Server/Repository/SettingRepository.cs b/Oqtane.Server/Repository/SettingRepository.cs index 2fdcbae1..53a6f450 100644 --- a/Oqtane.Server/Repository/SettingRepository.cs +++ b/Oqtane.Server/Repository/SettingRepository.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Internal; using Microsoft.Extensions.Caching.Memory; using Oqtane.Infrastructure; using Oqtane.Models; @@ -10,14 +11,16 @@ namespace Oqtane.Repository { public class SettingRepository : ISettingRepository { - private TenantDBContext _tenant; + private readonly IDbContextFactory _tenantContextFactory; + private readonly TenantDBContext _tenantQueryContext; private MasterDBContext _master; private readonly ITenantManager _tenantManager; private readonly IMemoryCache _cache; - public SettingRepository(TenantDBContext tenant, MasterDBContext master, ITenantManager tenantManager, IMemoryCache cache) + public SettingRepository(IDbContextFactory tenantContextFactory, MasterDBContext master, ITenantManager tenantManager, IMemoryCache cache) { - _tenant = tenant; + _tenantContextFactory = tenantContextFactory; + _tenantQueryContext = tenantContextFactory.CreateDbContext(); _master = master; _tenantManager = tenantManager; _cache = cache; @@ -31,7 +34,7 @@ namespace Oqtane.Repository } else { - return _tenant.Setting.Where(item => item.EntityName == entityName); + return _tenantQueryContext.Setting.Where(item => item.EntityName == entityName); } } @@ -43,6 +46,7 @@ namespace Oqtane.Repository public Setting AddSetting(Setting setting) { + using var tenant = _tenantContextFactory.CreateDbContext(); if (IsMaster(setting.EntityName)) { _master.Setting.Add(setting); @@ -50,8 +54,8 @@ namespace Oqtane.Repository } else { - _tenant.Setting.Add(setting); - _tenant.SaveChanges(); + tenant.Setting.Add(setting); + tenant.SaveChanges(); } ManageCache(setting.EntityName); return setting; @@ -59,6 +63,7 @@ namespace Oqtane.Repository public Setting UpdateSetting(Setting setting) { + using var tenant = _tenantContextFactory.CreateDbContext(); if (IsMaster(setting.EntityName)) { _master.Entry(setting).State = EntityState.Modified; @@ -66,8 +71,8 @@ namespace Oqtane.Repository } else { - _tenant.Entry(setting).State = EntityState.Modified; - _tenant.SaveChanges(); + tenant.Entry(setting).State = EntityState.Modified; + tenant.SaveChanges(); } ManageCache(setting.EntityName); return setting; @@ -75,30 +80,33 @@ namespace Oqtane.Repository public Setting GetSetting(string entityName, int settingId) { + using var tenant = _tenantContextFactory.CreateDbContext(); if (IsMaster(entityName)) { return _master.Setting.Find(settingId); } else { - return _tenant.Setting.Find(settingId); + return tenant.Setting.Find(settingId); } } public Setting GetSetting(string entityName, int entityId, string settingName) { + using var tenant = _tenantContextFactory.CreateDbContext(); if (IsMaster(entityName)) { return _master.Setting.Where(item => item.EntityName == entityName && item.EntityId == entityId && item.SettingName == settingName).FirstOrDefault(); } else { - return _tenant.Setting.Where(item => item.EntityName == entityName && item.EntityId == entityId && item.SettingName == settingName).FirstOrDefault(); + return tenant.Setting.Where(item => item.EntityName == entityName && item.EntityId == entityId && item.SettingName == settingName).FirstOrDefault(); } } public void DeleteSetting(string entityName, int settingId) { + using var tenant = _tenantContextFactory.CreateDbContext(); if (IsMaster(entityName)) { Setting setting = _master.Setting.Find(settingId); @@ -107,15 +115,16 @@ namespace Oqtane.Repository } else { - Setting setting = _tenant.Setting.Find(settingId); - _tenant.Setting.Remove(setting); - _tenant.SaveChanges(); + Setting setting = tenant.Setting.Find(settingId); + tenant.Setting.Remove(setting); + tenant.SaveChanges(); } ManageCache(entityName); } public void DeleteSettings(string entityName, int entityId) { + using var tenant = _tenantContextFactory.CreateDbContext(); if (IsMaster(entityName)) { IEnumerable settings = _master.Setting @@ -129,14 +138,14 @@ namespace Oqtane.Repository } else { - IEnumerable settings = _tenant.Setting + IEnumerable settings = tenant.Setting .Where(item => item.EntityName == entityName) .Where(item => item.EntityId == entityId); foreach (Setting setting in settings) { - _tenant.Setting.Remove(setting); + tenant.Setting.Remove(setting); } - _tenant.SaveChanges(); + tenant.SaveChanges(); } ManageCache(entityName); } diff --git a/Oqtane.Server/Repository/SiteRepository.cs b/Oqtane.Server/Repository/SiteRepository.cs index 4886af28..f1e82ef5 100644 --- a/Oqtane.Server/Repository/SiteRepository.cs +++ b/Oqtane.Server/Repository/SiteRepository.cs @@ -17,8 +17,8 @@ namespace Oqtane.Repository { public class SiteRepository : ISiteRepository { - private readonly TenantDBContext _db; private readonly IDbContextFactory _factory; + private readonly TenantDBContext _queryContext; private readonly IRoleRepository _roleRepository; private readonly IProfileRepository _profileRepository; private readonly IFolderRepository _folderRepository; @@ -33,12 +33,12 @@ namespace Oqtane.Repository private readonly ILogManager _logger; private static readonly object _lock = new object(); - public SiteRepository(TenantDBContext context, IDbContextFactory factory, IRoleRepository roleRepository, IProfileRepository profileRepository, IFolderRepository folderRepository, IPageRepository pageRepository, + public SiteRepository(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; + _queryContext = _factory.CreateDbContext(); _roleRepository = roleRepository; _profileRepository = profileRepository; _folderRepository = folderRepository; @@ -107,22 +107,24 @@ namespace Oqtane.Repository // synchronous methods public IEnumerable GetSites() { - return _db.Site.OrderBy(item => item.Name); + return _queryContext.Site.OrderBy(item => item.Name); } public Site AddSite(Site site) { + using var ctx = _factory.CreateDbContext(); site.SiteGuid = Guid.NewGuid().ToString(); - _db.Site.Add(site); - _db.SaveChanges(); + ctx.Site.Add(site); + ctx.SaveChanges(); CreateSite(site); return site; } public Site UpdateSite(Site site) { - _db.Entry(site).State = EntityState.Modified; - _db.SaveChanges(); + using var ctx = _factory.CreateDbContext(); + ctx.Entry(site).State = EntityState.Modified; + ctx.SaveChanges(); return site; } @@ -133,21 +135,23 @@ namespace Oqtane.Repository public Site GetSite(int siteId, bool tracking) { + using var ctx = _factory.CreateDbContext(); if (tracking) { - return _db.Site.Find(siteId); + return ctx.Site.Find(siteId); } else { - return _db.Site.AsNoTracking().FirstOrDefault(item => item.SiteId == siteId); + return ctx.Site.AsNoTracking().FirstOrDefault(item => item.SiteId == siteId); } } public void DeleteSite(int siteId) { - var site = _db.Site.Find(siteId); - _db.Site.Remove(site); - _db.SaveChanges(); + using var ctx = _factory.CreateDbContext(); + var site = ctx.Site.Find(siteId); + ctx.Site.Remove(site); + ctx.SaveChanges(); } diff --git a/Oqtane.Server/Repository/UrlMappingRepository.cs b/Oqtane.Server/Repository/UrlMappingRepository.cs index 375c555b..a896e6de 100644 --- a/Oqtane.Server/Repository/UrlMappingRepository.cs +++ b/Oqtane.Server/Repository/UrlMappingRepository.cs @@ -8,12 +8,14 @@ namespace Oqtane.Repository { public class UrlMappingRepository : IUrlMappingRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; + private readonly TenantDBContext _queryContext; private readonly ISiteRepository _sites; - public UrlMappingRepository(TenantDBContext context, ISiteRepository sites) + public UrlMappingRepository(IDbContextFactory dbContextFactory, ISiteRepository sites) { - _db = context; + _dbContextFactory = dbContextFactory; + _queryContext = _dbContextFactory.CreateDbContext(); _sites = sites; } @@ -21,49 +23,54 @@ namespace Oqtane.Repository { if (isMapped) { - return _db.UrlMapping.Where(item => item.SiteId == siteId && !string.IsNullOrEmpty(item.MappedUrl)).Take(200); + return _queryContext.UrlMapping.Where(item => item.SiteId == siteId && !string.IsNullOrEmpty(item.MappedUrl)).Take(200); } else { - return _db.UrlMapping.Where(item => item.SiteId == siteId && string.IsNullOrEmpty(item.MappedUrl)).Take(200); + return _queryContext.UrlMapping.Where(item => item.SiteId == siteId && string.IsNullOrEmpty(item.MappedUrl)).Take(200); } } public UrlMapping AddUrlMapping(UrlMapping urlMapping) { - _db.UrlMapping.Add(urlMapping); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.UrlMapping.Add(urlMapping); + db.SaveChanges(); return urlMapping; } public UrlMapping UpdateUrlMapping(UrlMapping urlMapping) { - _db.Entry(urlMapping).State = EntityState.Modified; - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Entry(urlMapping).State = EntityState.Modified; + db.SaveChanges(); return urlMapping; } public UrlMapping GetUrlMapping(int urlMappingId) { + using var db = _dbContextFactory.CreateDbContext(); return GetUrlMapping(urlMappingId, true); } public UrlMapping GetUrlMapping(int urlMappingId, bool tracking) { + using var db = _dbContextFactory.CreateDbContext(); if (tracking) { - return _db.UrlMapping.Find(urlMappingId); + return db.UrlMapping.Find(urlMappingId); } else { - return _db.UrlMapping.AsNoTracking().FirstOrDefault(item => item.UrlMappingId == urlMappingId); + return db.UrlMapping.AsNoTracking().FirstOrDefault(item => item.UrlMappingId == urlMappingId); } } public UrlMapping GetUrlMapping(int siteId, string url) { + using var db = _dbContextFactory.CreateDbContext(); url = (url.Length > 750) ? url.Substring(0, 750) : url; - var urlMapping = _db.UrlMapping.Where(item => item.SiteId == siteId && item.Url == url).FirstOrDefault(); + var urlMapping = db.UrlMapping.Where(item => item.SiteId == siteId && item.Url == url).FirstOrDefault(); if (urlMapping == null) { var site = _sites.GetSite(siteId); @@ -90,9 +97,10 @@ namespace Oqtane.Repository public void DeleteUrlMapping(int urlMappingId) { - UrlMapping urlMapping = _db.UrlMapping.Find(urlMappingId); - _db.UrlMapping.Remove(urlMapping); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + UrlMapping urlMapping = db.UrlMapping.Find(urlMappingId); + db.UrlMapping.Remove(urlMapping); + db.SaveChanges(); } } } diff --git a/Oqtane.Server/Repository/UserRepository.cs b/Oqtane.Server/Repository/UserRepository.cs index 8320a748..512c1fb3 100644 --- a/Oqtane.Server/Repository/UserRepository.cs +++ b/Oqtane.Server/Repository/UserRepository.cs @@ -8,14 +8,16 @@ namespace Oqtane.Repository { public class UserRepository : IUserRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; + private readonly TenantDBContext _queryContext; private readonly IFolderRepository _folders; private readonly IRoleRepository _roles; private readonly IUserRoleRepository _userroles; - public UserRepository(TenantDBContext context, IFolderRepository folders, IRoleRepository roles, IUserRoleRepository userroles) + public UserRepository(IDbContextFactory dbContextFactory, IFolderRepository folders, IRoleRepository roles, IUserRoleRepository userroles) { - _db = context; + _dbContextFactory = dbContextFactory; + _queryContext = _dbContextFactory.CreateDbContext(); _folders = folders; _roles = roles; _userroles = userroles; @@ -23,25 +25,26 @@ namespace Oqtane.Repository public IEnumerable GetUsers() { - return _db.User; + return _queryContext.User; } public User AddUser(User user) { - if (_db.User.AsNoTracking().FirstOrDefault(item => item.Username == user.Username) == null) + using var db = _dbContextFactory.CreateDbContext(); + if (db.User.AsNoTracking().FirstOrDefault(item => item.Username == user.Username) == null) { - _db.User.Add(user); - _db.SaveChanges(); + db.User.Add(user); + db.SaveChanges(); } else { int siteId = user.SiteId; - user = _db.User.AsNoTracking().First(item => item.Username == user.Username); + user = db.User.AsNoTracking().First(item => item.Username == user.Username); user.SiteId = siteId; } // add folder for user - Folder folder = _folders.GetFolder(user.SiteId, "Users/"); + var folder = _folders.GetFolder(user.SiteId, "Users/"); if (folder != null) { _folders.AddFolder(new Folder @@ -65,10 +68,10 @@ namespace Oqtane.Repository } // add auto assigned roles to user for site - List roles = _roles.GetRoles(user.SiteId).Where(item => item.IsAutoAssigned).ToList(); - foreach (Role role in roles) + var roles = _roles.GetRoles(user.SiteId).Where(item => item.IsAutoAssigned).ToList(); + foreach (var role in roles) { - UserRole userrole = new UserRole(); + var userrole = new UserRole(); userrole.UserId = user.UserId; userrole.RoleId = role.RoleId; userrole.EffectiveDate = null; @@ -81,8 +84,9 @@ namespace Oqtane.Repository public User UpdateUser(User user) { - _db.Entry(user).State = EntityState.Modified; - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Entry(user).State = EntityState.Modified; + db.SaveChanges(); return user; } @@ -93,13 +97,14 @@ namespace Oqtane.Repository public User GetUser(int userId, bool tracking) { + using var db = _dbContextFactory.CreateDbContext(); if (tracking) { - return _db.User.Find(userId); + return db.User.Find(userId); } else { - return _db.User.AsNoTracking().FirstOrDefault(item => item.UserId == userId); + return db.User.AsNoTracking().FirstOrDefault(item => item.UserId == userId); } } @@ -110,23 +115,25 @@ namespace Oqtane.Repository public User GetUser(string username, string email) { + using var db = _dbContextFactory.CreateDbContext(); User user = null; if (!string.IsNullOrEmpty(username)) { - user = _db.User.Where(item => item.Username == username).FirstOrDefault(); + user = db.User.Where(item => item.Username == username).FirstOrDefault(); } if (user == null && !string.IsNullOrEmpty(email)) { - user = _db.User.Where(item => item.Email == email).FirstOrDefault(); + user = db.User.Where(item => item.Email == email).FirstOrDefault(); } return user; } public void DeleteUser(int userId) { - User user = _db.User.Find(userId); - _db.User.Remove(user); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + var user = db.User.Find(userId); + db.User.Remove(user); + db.SaveChanges(); } } } diff --git a/Oqtane.Server/Repository/UserRoleRepository.cs b/Oqtane.Server/Repository/UserRoleRepository.cs index 730009e1..3e835dc2 100644 --- a/Oqtane.Server/Repository/UserRoleRepository.cs +++ b/Oqtane.Server/Repository/UserRoleRepository.cs @@ -8,18 +8,20 @@ namespace Oqtane.Repository { public class UserRoleRepository : IUserRoleRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; + private readonly TenantDBContext _queryContext; private readonly IRoleRepository _roles; - public UserRoleRepository(TenantDBContext context, IRoleRepository roles) + public UserRoleRepository(IDbContextFactory dbContextFactory, IRoleRepository roles) { - _db = context; + _dbContextFactory = dbContextFactory; + _queryContext = _dbContextFactory.CreateDbContext(); _roles = roles; } public IEnumerable GetUserRoles(int siteId) { - return _db.UserRole + return _queryContext.UserRole .Include(item => item.Role) // eager load roles .Include(item => item.User) // eager load users .Where(item => item.Role.SiteId == siteId || item.Role.SiteId == null); @@ -27,7 +29,7 @@ namespace Oqtane.Repository public IEnumerable GetUserRoles(int userId, int siteId) { - return _db.UserRole.Where(item => item.UserId == userId) + return _queryContext.UserRole.Where(item => item.UserId == userId) .Include(item => item.Role) // eager load roles .Include(item => item.User) // eager load users .Where(item => item.Role.SiteId == siteId || item.Role.SiteId == null || siteId == -1); @@ -35,8 +37,9 @@ namespace Oqtane.Repository public UserRole AddUserRole(UserRole userRole) { - _db.UserRole.Add(userRole); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.UserRole.Add(userRole); + db.SaveChanges(); // host roles can only exist at global level - remove any site specific user roles var role = _roles.GetRole(userRole.RoleId); @@ -50,8 +53,9 @@ namespace Oqtane.Repository public UserRole UpdateUserRole(UserRole userRole) { - _db.Entry(userRole).State = EntityState.Modified; - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Entry(userRole).State = EntityState.Modified; + db.SaveChanges(); return userRole; } @@ -62,16 +66,17 @@ namespace Oqtane.Repository public UserRole GetUserRole(int userRoleId, bool tracking) { + using var db = _dbContextFactory.CreateDbContext(); if (tracking) { - return _db.UserRole + return db.UserRole .Include(item => item.Role) // eager load roles .Include(item => item.User) // eager load users .FirstOrDefault(item => item.UserRoleId == userRoleId); } else { - return _db.UserRole.AsNoTracking() + return db.UserRole.AsNoTracking() .Include(item => item.Role) // eager load roles .Include(item => item.User) // eager load users .FirstOrDefault(item => item.UserRoleId == userRoleId); @@ -85,16 +90,17 @@ namespace Oqtane.Repository public UserRole GetUserRole(int userId, int roleId, bool tracking) { + using var db = _dbContextFactory.CreateDbContext(); if (tracking) { - return _db.UserRole + return db.UserRole .Include(item => item.Role) // eager load roles .Include(item => item.User) // eager load users .FirstOrDefault(item => item.UserId == userId && item.RoleId == roleId); } else { - return _db.UserRole.AsNoTracking() + return db.UserRole.AsNoTracking() .Include(item => item.Role) // eager load roles .Include(item => item.User) // eager load users .FirstOrDefault(item => item.UserId == userId && item.RoleId == roleId); @@ -103,18 +109,20 @@ namespace Oqtane.Repository public void DeleteUserRole(int userRoleId) { - UserRole userRole = _db.UserRole.Find(userRoleId); - _db.UserRole.Remove(userRole); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + var userRole = db.UserRole.Find(userRoleId); + db.UserRole.Remove(userRole); + db.SaveChanges(); } public void DeleteUserRoles(int userId) { - foreach (UserRole userRole in _db.UserRole.Where(item => item.UserId == userId && item.Role.SiteId != null)) + using var db = _dbContextFactory.CreateDbContext(); + foreach (var userRole in db.UserRole.Where(item => item.UserId == userId && item.Role.SiteId != null)) { - _db.UserRole.Remove(userRole); + db.UserRole.Remove(userRole); } - _db.SaveChanges(); + db.SaveChanges(); } } } diff --git a/Oqtane.Server/Repository/VisitorRepository.cs b/Oqtane.Server/Repository/VisitorRepository.cs index 866d61f9..e0d082fd 100644 --- a/Oqtane.Server/Repository/VisitorRepository.cs +++ b/Oqtane.Server/Repository/VisitorRepository.cs @@ -8,64 +8,72 @@ namespace Oqtane.Repository { public class VisitorRepository : IVisitorRepository { - private TenantDBContext _db; + private readonly IDbContextFactory _dbContextFactory; + private readonly TenantDBContext _queryContext; - public VisitorRepository(TenantDBContext context) + public VisitorRepository(IDbContextFactory dbContextFactory) { - _db = context; + _dbContextFactory = dbContextFactory; + _queryContext = _dbContextFactory.CreateDbContext(); } public IEnumerable GetVisitors(int siteId, DateTime fromDate) { - return _db.Visitor.AsNoTracking() + return _queryContext.Visitor.AsNoTracking() .Include(item => item.User) // eager load users .Where(item => item.SiteId == siteId && item.VisitedOn >= fromDate); } public Visitor AddVisitor(Visitor visitor) { - _db.Visitor.Add(visitor); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Visitor.Add(visitor); + db.SaveChanges(); return visitor; } public Visitor UpdateVisitor(Visitor visitor) { - _db.Entry(visitor).State = EntityState.Modified; - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + db.Entry(visitor).State = EntityState.Modified; + db.SaveChanges(); return visitor; } public Visitor GetVisitor(int visitorId) { - return _db.Visitor.Find(visitorId); + using var db = _dbContextFactory.CreateDbContext(); + return db.Visitor.Find(visitorId); } public Visitor GetVisitor(int siteId, string IPAddress) { - return _db.Visitor.FirstOrDefault(item => item.SiteId == siteId && item.IPAddress == IPAddress); + using var db = _dbContextFactory.CreateDbContext(); + return db.Visitor.FirstOrDefault(item => item.SiteId == siteId && item.IPAddress == IPAddress); } public void DeleteVisitor(int visitorId) { - Visitor visitor = _db.Visitor.Find(visitorId); - _db.Visitor.Remove(visitor); - _db.SaveChanges(); + using var db = _dbContextFactory.CreateDbContext(); + var visitor = db.Visitor.Find(visitorId); + db.Visitor.Remove(visitor); + db.SaveChanges(); } public int DeleteVisitors(int siteId, int age) { + using var db = _dbContextFactory.CreateDbContext(); // delete visitors in batches of 100 records - int count = 0; + var count = 0; var purgedate = DateTime.UtcNow.AddDays(-age); - var visitors = _db.Visitor.Where(item => item.SiteId == siteId && item.Visits < 2 && item.VisitedOn < purgedate) + var visitors = db.Visitor.Where(item => item.SiteId == siteId && item.Visits < 2 && item.VisitedOn < purgedate) .OrderBy(item => item.VisitedOn).Take(100).ToList(); while (visitors.Count > 0) { count += visitors.Count; - _db.Visitor.RemoveRange(visitors); - _db.SaveChanges(); - visitors = _db.Visitor.Where(item => item.SiteId == siteId && item.Visits < 2 && item.VisitedOn < purgedate) + db.Visitor.RemoveRange(visitors); + db.SaveChanges(); + visitors = db.Visitor.Where(item => item.SiteId == siteId && item.Visits < 2 && item.VisitedOn < purgedate) .OrderBy(item => item.VisitedOn).Take(100).ToList(); } return count; diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/[Module]Repository.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/[Module]Repository.cs index 522c26f8..2e6229e2 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/[Module]Repository.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/[Module]Repository.cs @@ -8,16 +8,18 @@ namespace [Owner].Module.[Module].Repository { public class [Module]Repository : I[Module]Repository, ITransientService { - private readonly [Module]Context _db; + private readonly IDbContextFactory<[Module]Context> _factory; + private readonly [Module]Context _queryContext; - public [Module]Repository([Module]Context context) + public [Module]Repository(IDbContextFactory<[Module]Context> factory) { - _db = context; + _factory = factory; + _queryContext = _factory.CreateDbContext(); } public IEnumerable Get[Module]s(int ModuleId) { - return _db.[Module].Where(item => item.ModuleId == ModuleId); + return _queryContext.[Module].Where(item => item.ModuleId == ModuleId); } public Models.[Module] Get[Module](int [Module]Id) @@ -27,35 +29,39 @@ namespace [Owner].Module.[Module].Repository public Models.[Module] Get[Module](int [Module]Id, bool tracking) { + using var db = _factory.CreateDbContext(); if (tracking) { - return _db.[Module].Find([Module]Id); + return db.[Module].Find([Module]Id); } else { - return _db.[Module].AsNoTracking().FirstOrDefault(item => item.[Module]Id == [Module]Id); + return db.[Module].AsNoTracking().FirstOrDefault(item => item.[Module]Id == [Module]Id); } } public Models.[Module] Add[Module](Models.[Module] [Module]) { - _db.[Module].Add([Module]); - _db.SaveChanges(); + using var db = _factory.CreateDbContext(); + db.[Module].Add([Module]); + db.SaveChanges(); return [Module]; } public Models.[Module] Update[Module](Models.[Module] [Module]) { - _db.Entry([Module]).State = EntityState.Modified; - _db.SaveChanges(); + using var db = _factory.CreateDbContext(); + db.Entry([Module]).State = EntityState.Modified; + db.SaveChanges(); return [Module]; } public void Delete[Module](int [Module]Id) { - Models.[Module] [Module] = _db.[Module].Find([Module]Id); - _db.[Module].Remove([Module]); - _db.SaveChanges(); + using var db = _factory.CreateDbContext(); + Models.[Module] [Module] = db.[Module].Find([Module]Id); + db.[Module].Remove([Module]); + db.SaveChanges(); } } }