From 7f24956ddd1639fc65958bfeb805ebfc1d0969d1 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 6 Sep 2020 17:24:32 +0100 Subject: [PATCH] Use bulk insertions to SQL. --- .gitmodules | 3 ++ EFCore.BulkExtensions | 1 + RomRepoMgr.Core/Workers/DatImporter.cs | 38 +++++++++++++++---- RomRepoMgr.Database/Models/DiskByMachine.cs | 4 +- RomRepoMgr.Database/Models/FileByMachine.cs | 4 +- RomRepoMgr.Database/Models/Machine.cs | 9 +++-- RomRepoMgr.Database/Models/MediaByMachine.cs | 4 +- .../RomRepoMgr.Database.csproj | 1 + RomRepoMgr.sln | 6 +++ 9 files changed, 55 insertions(+), 15 deletions(-) create mode 160000 EFCore.BulkExtensions diff --git a/.gitmodules b/.gitmodules index b0fa098..4b545c5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "winfsp"] path = winfsp url = https://github.com/billziss-gh/winfsp/ +[submodule "EFCore.BulkExtensions"] + path = EFCore.BulkExtensions + url = https://github.com/claunia/EFCore.BulkExtensions diff --git a/EFCore.BulkExtensions b/EFCore.BulkExtensions new file mode 160000 index 0000000..39aa766 --- /dev/null +++ b/EFCore.BulkExtensions @@ -0,0 +1 @@ +Subproject commit 39aa76658c4ba52cf7a2c2eb713cf975434e27ee diff --git a/RomRepoMgr.Core/Workers/DatImporter.cs b/RomRepoMgr.Core/Workers/DatImporter.cs index 68ac6ce..83fb4ea 100644 --- a/RomRepoMgr.Core/Workers/DatImporter.cs +++ b/RomRepoMgr.Core/Workers/DatImporter.cs @@ -29,6 +29,7 @@ using System.Diagnostics; using System.IO; using System.Linq; using Aaru.Checksums; +using EFCore.BulkExtensions; using RomRepoMgr.Core.EventArgs; using RomRepoMgr.Core.Models; using RomRepoMgr.Core.Resources; @@ -165,14 +166,13 @@ namespace RomRepoMgr.Core.Workers var machine = new Machine { Name = name, - RomSet = romSet, + RomSetId = romSet.Id, CreatedOn = DateTime.UtcNow, UpdatedOn = DateTime.UtcNow }; machines[name] = machine; - ctx.Machines.Add(machine); position++; } @@ -183,6 +183,7 @@ namespace RomRepoMgr.Core.Workers SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty); + ctx.BulkInsert(machines.Values.ToList(), b => b.SetOutputIdentity = true); ctx.SaveChanges(); SetMessage?.Invoke(this, new MessageEventArgs @@ -441,8 +442,15 @@ namespace RomRepoMgr.Core.Workers SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty); - ctx.Files.AddRange(newFiles); - ctx.FilesByMachines.AddRange(newFilesByMachine); + ctx.BulkInsert(newFiles, b => b.SetOutputIdentity = true); + + foreach(FileByMachine fbm in newFilesByMachine) + { + fbm.FileId = fbm.File.Id; + fbm.MachineId = fbm.Machine.Id; + } + + ctx.BulkInsert(newFilesByMachine); ctx.SaveChanges(); @@ -562,8 +570,15 @@ namespace RomRepoMgr.Core.Workers SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty); - ctx.Disks.AddRange(newDisks); - ctx.DisksByMachines.AddRange(newDisksByMachine); + ctx.BulkInsert(newDisks, b => b.SetOutputIdentity = true); + + foreach(DiskByMachine dbm in newDisksByMachine) + { + dbm.DiskId = dbm.Disk.Id; + dbm.MachineId = dbm.Machine.Id; + } + + ctx.BulkInsert(newDisksByMachine); ctx.SaveChanges(); @@ -697,8 +712,15 @@ namespace RomRepoMgr.Core.Workers SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty); - ctx.Medias.AddRange(newMedias); - ctx.MediasByMachines.AddRange(newMediasByMachine); + ctx.BulkInsert(newMedias, b => b.SetOutputIdentity = true); + + foreach(MediaByMachine mbm in newMediasByMachine) + { + mbm.MediaId = mbm.Media.Id; + mbm.MachineId = mbm.Machine.Id; + } + + ctx.BulkInsert(newMediasByMachine); ctx.SaveChanges(); diff --git a/RomRepoMgr.Database/Models/DiskByMachine.cs b/RomRepoMgr.Database/Models/DiskByMachine.cs index a0c7df6..e760d32 100644 --- a/RomRepoMgr.Database/Models/DiskByMachine.cs +++ b/RomRepoMgr.Database/Models/DiskByMachine.cs @@ -36,6 +36,8 @@ namespace RomRepoMgr.Database.Models [Required] public virtual Machine Machine { get; set; } [Required] - public string Name { get; set; } + public string Name { get; set; } + public ulong DiskId { get; set; } + public ulong MachineId { get; set; } } } \ No newline at end of file diff --git a/RomRepoMgr.Database/Models/FileByMachine.cs b/RomRepoMgr.Database/Models/FileByMachine.cs index af721e6..75d0b43 100644 --- a/RomRepoMgr.Database/Models/FileByMachine.cs +++ b/RomRepoMgr.Database/Models/FileByMachine.cs @@ -36,6 +36,8 @@ namespace RomRepoMgr.Database.Models [Required] public virtual Machine Machine { get; set; } [Required] - public string Name { get; set; } + public string Name { get; set; } + public ulong FileId { get; set; } + public ulong MachineId { get; set; } } } \ No newline at end of file diff --git a/RomRepoMgr.Database/Models/Machine.cs b/RomRepoMgr.Database/Models/Machine.cs index 0d2bfbe..9a8ddb2 100644 --- a/RomRepoMgr.Database/Models/Machine.cs +++ b/RomRepoMgr.Database/Models/Machine.cs @@ -33,9 +33,10 @@ namespace RomRepoMgr.Database.Models [Required] public string Name { get; set; } [Required] - public virtual RomSet RomSet { get; set; } - public virtual ICollection Files { get; set; } - public virtual ICollection Disks { get; set; } - public virtual ICollection Medias { get; set; } + public virtual RomSet RomSet { get; set; } + public virtual ICollection Files { get; set; } + public virtual ICollection Disks { get; set; } + public virtual ICollection Medias { get; set; } + public long RomSetId { get; set; } } } \ No newline at end of file diff --git a/RomRepoMgr.Database/Models/MediaByMachine.cs b/RomRepoMgr.Database/Models/MediaByMachine.cs index fce268e..0f55896 100644 --- a/RomRepoMgr.Database/Models/MediaByMachine.cs +++ b/RomRepoMgr.Database/Models/MediaByMachine.cs @@ -36,6 +36,8 @@ namespace RomRepoMgr.Database.Models [Required] public virtual Machine Machine { get; set; } [Required] - public string Name { get; set; } + public string Name { get; set; } + public ulong MediaId { get; set; } + public ulong MachineId { get; set; } } } \ No newline at end of file diff --git a/RomRepoMgr.Database/RomRepoMgr.Database.csproj b/RomRepoMgr.Database/RomRepoMgr.Database.csproj index af30eb3..ec5392d 100644 --- a/RomRepoMgr.Database/RomRepoMgr.Database.csproj +++ b/RomRepoMgr.Database/RomRepoMgr.Database.csproj @@ -20,6 +20,7 @@ + diff --git a/RomRepoMgr.sln b/RomRepoMgr.sln index 340580f..d0ce398 100644 --- a/RomRepoMgr.sln +++ b/RomRepoMgr.sln @@ -12,6 +12,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Library", "Sabre EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "winfsp-netcore", "winfsp-netcore\winfsp-netcore.csproj", "{4B2B4DAC-39E2-417D-90F2-DCC97A5564B1}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EFCore.BulkExtensions", "EFCore.BulkExtensions\EFCore.BulkExtensions\EFCore.BulkExtensions.csproj", "{E17E880B-F3A7-4D0E-9583-A0645CE25135}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -42,5 +44,9 @@ Global {4B2B4DAC-39E2-417D-90F2-DCC97A5564B1}.Debug|Any CPU.Build.0 = Debug|Any CPU {4B2B4DAC-39E2-417D-90F2-DCC97A5564B1}.Release|Any CPU.ActiveCfg = Release|Any CPU {4B2B4DAC-39E2-417D-90F2-DCC97A5564B1}.Release|Any CPU.Build.0 = Release|Any CPU + {E17E880B-F3A7-4D0E-9583-A0645CE25135}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E17E880B-F3A7-4D0E-9583-A0645CE25135}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E17E880B-F3A7-4D0E-9583-A0645CE25135}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E17E880B-F3A7-4D0E-9583-A0645CE25135}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal