From 5b444f91e7e0f1c6b70f47afebcb2dfd1851b579 Mon Sep 17 00:00:00 2001 From: Pat Hartl Date: Wed, 3 Dec 2025 18:55:52 -0600 Subject: [PATCH] Make SyncRelationCollectionAsync only match existing records --- .../Importers/GameImporter.cs | 58 +++---------------- .../_BaseDatabaseService.cs | 12 +--- 2 files changed, 10 insertions(+), 60 deletions(-) diff --git a/LANCommander.Server.ImportExport/Importers/GameImporter.cs b/LANCommander.Server.ImportExport/Importers/GameImporter.cs index a9af0904..d16235e8 100644 --- a/LANCommander.Server.ImportExport/Importers/GameImporter.cs +++ b/LANCommander.Server.ImportExport/Importers/GameImporter.cs @@ -53,6 +53,7 @@ public class GameImporter( try { await gameService.AddAsync(game); + await UpdateRelationshipsAsync(); return true; } @@ -87,6 +88,7 @@ public class GameImporter( existing.UpdatedBy = await userService.GetAsync(record.UpdatedBy); await gameService.UpdateAsync(existing); + await UpdateRelationshipsAsync(); return true; } @@ -102,7 +104,7 @@ public class GameImporter( return await gameService.ExistsAsync(g => g.Id == record.Id || g.Title == record.Title); } - public async Task FinalizeAsync() + public async Task UpdateRelationshipsAsync() { if (ImportContext.Manifest is not Game) return; @@ -113,84 +115,42 @@ public class GameImporter( return; var game = await gameService - .Include(g => g.Collections) - .Include(g => g.Developers) - .Include(g => g.Genres) - .Include(g => g.Platforms) - .Include(g => g.Publishers) - .Include(g => g.Tags) .GetAsync(manifest.Id); await gameService.SyncRelatedCollectionAsync( game, g => g.Collections, manifest.Collections, - r => c => c.Name == r.Name, - (c, rc) => - { - c.Name = rc.Name; - c.CreatedOn = rc.CreatedOn; - c.UpdatedOn = rc.UpdatedOn; - }); + r => c => c.Name == r.Name); await gameService.SyncRelatedCollectionAsync( game, g => g.Developers, manifest.Developers, - r => c => c.Name == r.Name, - (d, rd) => - { - d.Name = rd.Name; - d.CreatedOn = rd.CreatedOn; - d.UpdatedOn = rd.UpdatedOn; - }); + r => c => c.Name == r.Name); await gameService.SyncRelatedCollectionAsync( game, g => g.Genres, manifest.Genres, - r => g => g.Name == r.Name, - (g, gr) => - { - g.Name = gr.Name; - g.CreatedOn = gr.CreatedOn; - g.UpdatedOn = gr.UpdatedOn; - }); + r => g => g.Name == r.Name); await gameService.SyncRelatedCollectionAsync( game, g => g.Platforms, manifest.Platforms, - r => p => p.Name == r.Name, - (p, pr) => - { - p.Name = pr.Name; - p.CreatedOn = pr.CreatedOn; - p.UpdatedOn = pr.UpdatedOn; - }); + r => p => p.Name == r.Name); await gameService.SyncRelatedCollectionAsync( game, g => g.Publishers, manifest.Publishers, - r => p => p.Name == r.Name, - (p, pr) => - { - p.Name = pr.Name; - p.CreatedOn = pr.CreatedOn; - p.UpdatedOn = pr.UpdatedOn; - }); + r => p => p.Name == r.Name); await gameService.SyncRelatedCollectionAsync( game, g => g.Tags, manifest.Tags, - r => t => t.Name == r.Name, - (t, tr) => - { - t.Name = tr.Name; - t.CreatedOn = tr.CreatedOn; - t.UpdatedOn = tr.UpdatedOn; - }); + r => t => t.Name == r.Name); } } diff --git a/LANCommander.Server.Services/_BaseDatabaseService.cs b/LANCommander.Server.Services/_BaseDatabaseService.cs index e2e33411..05d7d1e7 100644 --- a/LANCommander.Server.Services/_BaseDatabaseService.cs +++ b/LANCommander.Server.Services/_BaseDatabaseService.cs @@ -384,8 +384,7 @@ namespace LANCommander.Server.Services T entity, Expression>> navigationProperty, IEnumerable records, - Func>> matchExpression, - Action updateAction) where TChild : class where T : class + Func>> matchExpression) where TChild : class where T : class { using var context = await dbContextFactory.CreateDbContextAsync(); @@ -431,17 +430,8 @@ namespace LANCommander.Server.Services if (!collection.Contains(existingChild)) collection.Add(existingChild); - updateAction(existingChild, record); matchedChildren.Add(existingChild); } - else - { - var newChild = Activator.CreateInstance(); - - updateAction(newChild, record); - collection.Add(newChild); - matchedChildren.Add(newChild); - } } var toDelete = collection.Where(child => !matchedChildren.Contains(child));