diff --git a/src/ScadaLink.Transport/Import/BundleImporter.cs b/src/ScadaLink.Transport/Import/BundleImporter.cs index a95c465..f182123 100644 --- a/src/ScadaLink.Transport/Import/BundleImporter.cs +++ b/src/ScadaLink.Transport/Import/BundleImporter.cs @@ -822,9 +822,14 @@ public sealed class BundleImporter : IBundleImporter var stubs = await _templateRepo.GetAllTemplatesAsync(ct).ConfigureAwait(false); var byName = stubs.ToDictionary(t => t.Name, t => t, StringComparer.Ordinal); - // ApplyTemplateFoldersAsync has already flushed every imported folder - // (and target folders pre-exist), so name-keyed lookup resolves to the - // persisted FolderId every imported template should reference. + // Folder ids must be materialised before we wire templates' FolderId + // FKs. ApplyTemplateFoldersAsync staged the rows via AddFolderAsync + // but did NOT call SaveChanges -- on a relational provider that means + // every new folder still has Id=0 in the change tracker. Flushing + // here is safe: we're inside the outer import transaction (begun in + // ApplyAsync), so any later throw still rolls everything back as one + // unit. The cost is one extra round-trip per import, negligible. + await _dbContext.SaveChangesAsync(ct).ConfigureAwait(false); var folders = await _templateRepo.GetAllFoldersAsync(ct).ConfigureAwait(false); var folderIdByName = folders.ToDictionary(f => f.Name, f => f.Id, StringComparer.Ordinal);