From 29a1e77da8fa5e302ec1b11559bc974da3c5a6a3 Mon Sep 17 00:00:00 2001 From: mauroc Date: Fri, 4 Oct 2024 22:46:40 +0200 Subject: [PATCH] Hard deletion of page more robust use of contexts (fixes issue: presence of stale records of deleted page on db). --- Oqtane.Server/Repository/PageRepository.cs | 31 +++++++++++++++------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/Oqtane.Server/Repository/PageRepository.cs b/Oqtane.Server/Repository/PageRepository.cs index 4bad39e3..e3bc27d0 100644 --- a/Oqtane.Server/Repository/PageRepository.cs +++ b/Oqtane.Server/Repository/PageRepository.cs @@ -91,18 +91,29 @@ namespace Oqtane.Repository public void DeletePage(int 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(); - foreach (var pageModule in pageModules) { - _pageModules.DeletePageModule(pageModule.PageModuleId); + 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(); + foreach (var pageModule in pageModules) + { + _pageModules.DeletePageModule(pageModule.PageModuleId); + } + + // At this point the page item is unaware of changes happened in other + // contexts (i.e.: the contex opened and closed in each DeletePageModule). + // Workin on page item may result in unxpected behaviour: + // better close and reopen context to work on a fresh page item. + } + + using var dbContext = _dbContextFactory.CreateDbContext(); + { + var page = dbContext.Page.Find(pageId); + dbContext.Page.Remove(page); + dbContext.SaveChanges(); } - // must occur after page modules are deleted because of cascading delete relationship - db.Page.Remove(page); - db.SaveChanges(); } } }