From 2e61a43e4f89a2098cdc9b1a04b85077c1b224e0 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Wed, 15 Feb 2023 12:43:18 -0500 Subject: [PATCH] fix #2596 - fix EF Core tracking error when updating a file in a folder which has a Capacity specified --- Oqtane.Server/Controllers/FileController.cs | 9 ++++----- Oqtane.Server/Repository/FileRepository.cs | 18 +++++++++++++++--- .../Repository/Interfaces/IFileRepository.cs | 1 + 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Oqtane.Server/Controllers/FileController.cs b/Oqtane.Server/Controllers/FileController.cs index cd6a9087..5473b154 100644 --- a/Oqtane.Server/Controllers/FileController.cs +++ b/Oqtane.Server/Controllers/FileController.cs @@ -20,7 +20,6 @@ using SixLabors.ImageSharp; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Formats.Png; using System.Net.Http; -using Oqtane.Migrations.Tenant; // ReSharper disable StringIndexOfIsCultureSpecific.1 @@ -142,7 +141,7 @@ namespace Oqtane.Controllers { if (File.Name != file.Name || File.FolderId != file.FolderId) { - file.Folder = _folders.GetFolder(file.FolderId); + file.Folder = _folders.GetFolder(file.FolderId, false); string folderpath = _folders.GetFolderPath(file.Folder); if (!Directory.Exists(folderpath)) { @@ -151,7 +150,7 @@ namespace Oqtane.Controllers System.IO.File.Move(_files.GetFilePath(File), Path.Combine(folderpath, file.Name)); } - var newfile = CreateFile(file.Name, file.Folder.FolderId, _files.GetFilePath(file)); + var newfile = CreateFile(File.Name, file.Folder.FolderId, _files.GetFilePath(file)); if (newfile != null) { file.Extension = newfile.Extension; @@ -659,10 +658,10 @@ namespace Oqtane.Controllers var file = _files.GetFile(folderid, filename); int size = 0; - var folder = _folders.GetFolder(folderid); + var folder = _folders.GetFolder(folderid, false); if (folder.Capacity != 0) { - foreach (var f in _files.GetFiles(folderid)) + foreach (var f in _files.GetFiles(folderid, false)) { size += f.Size; } diff --git a/Oqtane.Server/Repository/FileRepository.cs b/Oqtane.Server/Repository/FileRepository.cs index da233e29..cd56a3e4 100644 --- a/Oqtane.Server/Repository/FileRepository.cs +++ b/Oqtane.Server/Repository/FileRepository.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -27,10 +26,23 @@ namespace Oqtane.Repository } public IEnumerable GetFiles(int folderId) + { + return GetFiles(folderId, true); + } + + public IEnumerable GetFiles(int folderId, bool tracking) { var alias = _tenants.GetAlias(); IEnumerable permissions = _permissions.GetPermissions(alias.SiteId, EntityNames.Folder, folderId).ToList(); - IEnumerable files = _db.File.Where(item => item.FolderId == folderId).Include(item => item.Folder); + IEnumerable files; + if (tracking) + { + files = _db.File.Where(item => item.FolderId == folderId).Include(item => item.Folder); + } + else + { + files = _db.File.AsNoTracking().Where(item => item.FolderId == folderId).Include(item => item.Folder); + } foreach (File file in files) { file.Folder.Permissions = permissions.EncodePermissions(); @@ -135,7 +147,7 @@ namespace Oqtane.Repository public string GetFilePath(File file) { if (file == null) return null; - var folder = file.Folder ?? _db.Folder.Find(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/Interfaces/IFileRepository.cs b/Oqtane.Server/Repository/Interfaces/IFileRepository.cs index 556d02de..214b03d8 100644 --- a/Oqtane.Server/Repository/Interfaces/IFileRepository.cs +++ b/Oqtane.Server/Repository/Interfaces/IFileRepository.cs @@ -6,6 +6,7 @@ namespace Oqtane.Repository public interface IFileRepository { IEnumerable GetFiles(int folderId); + IEnumerable GetFiles(int folderId, bool tracking); File AddFile(File file); File UpdateFile(File file); File GetFile(int fileId);