瀏覽代碼

improve userdata migration (#14488)

JPVenson 6 天之前
父節點
當前提交
c62a07405e
共有 1 個文件被更改,包括 17 次插入1 次删除
  1. 17 1
      Jellyfin.Server/Migrations/Routines/MigrateLibraryUserData.cs

+ 17 - 1
Jellyfin.Server/Migrations/Routines/MigrateLibraryUserData.cs

@@ -8,6 +8,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using Emby.Server.Implementations.Data;
 using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities;
 using Jellyfin.Server.Implementations.Item;
 using Jellyfin.Server.ServerSetupApp;
 using MediaBrowser.Controller;
@@ -78,6 +79,8 @@ internal class MigrateLibraryUserData : IAsyncMigrationRoutine
 
     WHERE NOT EXISTS(SELECT 1 FROM TypedBaseItems WHERE TypedBaseItems.UserDataKey = UserDatas.key)
 """);
+
+            var importedUserData = new Dictionary<Guid, List<UserData>>();
             foreach (var entity in queryResult)
             {
                 var userData = MigrateLibraryDb.GetUserData(users, entity, userIdBlacklist, _logger);
@@ -95,9 +98,22 @@ internal class MigrateLibraryUserData : IAsyncMigrationRoutine
                     continue;
                 }
 
+                var ogId = userData.ItemId;
                 userData.ItemId = BaseItemRepository.PlaceholderId;
                 userData.RetentionDate = retentionDate;
-                dbContext.UserData.Add(userData);
+                if (!importedUserData.TryGetValue(ogId, out var importUserData))
+                {
+                    importUserData = [];
+                    importedUserData[ogId] = importUserData;
+                }
+
+                importUserData.Add(userData);
+            }
+
+            foreach (var item in importedUserData)
+            {
+                await dbContext.UserData.Where(e => e.ItemId == item.Key).ExecuteDeleteAsync(cancellationToken).ConfigureAwait(false);
+                dbContext.UserData.AddRange(item.Value.DistinctBy(e => e.CustomDataKey)); // old userdata can have fucked up duplicates
             }
 
             _logger.LogInformation("Try saving {NewSaved} UserData entries.", dbContext.UserData.Local.Count);