diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Database/ObservableReorderableDbCollection.cs b/src/Snap.Hutao/Snap.Hutao/Core/Database/ObservableReorderableDbCollection.cs index 95c669d4..7caba81f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Database/ObservableReorderableDbCollection.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Database/ObservableReorderableDbCollection.cs @@ -1,6 +1,7 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using CommunityToolkit.WinUI.Collections; using Microsoft.EntityFrameworkCore; using Snap.Hutao.Model; using Snap.Hutao.Model.Entity.Database; @@ -10,7 +11,7 @@ using System.Runtime.InteropServices; namespace Snap.Hutao.Core.Database; -internal sealed partial class ObservableReorderableDbCollection : ObservableCollection +internal sealed class ObservableReorderableDbCollection : ObservableCollection where TEntity : class, IReorderable { private readonly IServiceProvider serviceProvider; @@ -21,6 +22,8 @@ internal sealed partial class ObservableReorderableDbCollection : Obser this.serviceProvider = serviceProvider; } + public IAdvancedCollectionView? View { get; set; } + protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { base.OnCollectionChanged(e); @@ -48,22 +51,25 @@ internal sealed partial class ObservableReorderableDbCollection : Obser private void OnReorder() { - AdjustIndex((List)Items); - - using (IServiceScope scope = serviceProvider.CreateScope()) + using (View?.DeferRefresh()) { - AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + AdjustIndex((List)Items); - DbSet dbSet = appDbContext.Set(); - foreach (ref readonly TEntity item in CollectionsMarshal.AsSpan((List)Items)) + using (IServiceScope scope = serviceProvider.CreateScope()) { - dbSet.UpdateAndSave(item); + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + DbSet dbSet = appDbContext.Set(); + foreach (ref readonly TEntity item in CollectionsMarshal.AsSpan((List)Items)) + { + dbSet.UpdateAndSave(item); + } } } } } -internal sealed partial class ObservableReorderableDbCollection : ObservableCollection +[SuppressMessage("", "SA1402")] +internal sealed class ObservableReorderableDbCollection : ObservableCollection where TEntityOnly : class, IEntityOnly where TEntity : class, IReorderable { @@ -75,6 +81,8 @@ internal sealed partial class ObservableReorderableDbCollection)Items); - - using (IServiceScope scope = serviceProvider.CreateScope()) + using (View?.DeferRefresh()) { - AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + AdjustIndex((List)Items); - DbSet dbSet = appDbContext.Set(); - foreach (ref readonly TEntity item in CollectionsMarshal.AsSpan(((List)Items).SelectList(EntitySelector))) + using (IServiceScope scope = serviceProvider.CreateScope()) { - dbSet.UpdateAndSave(item); + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + + DbSet dbSet = appDbContext.Set(); + foreach (ref readonly TEntityOnly item in CollectionsMarshal.AsSpan((List)Items)) + { + dbSet.UpdateAndSave(item.Entity); + } } } } diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs index 8d6a8925..bc92c556 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs @@ -119,7 +119,9 @@ internal static partial class EnumerableExtension public static ObservableReorderableDbCollection ToObservableReorderableDbCollection(this IEnumerable source, IServiceProvider serviceProvider) where TEntity : class, IReorderable { - return new ObservableReorderableDbCollection([.. source], serviceProvider); + return source is List list + ? new ObservableReorderableDbCollection(list, serviceProvider) + : new ObservableReorderableDbCollection([.. source], serviceProvider); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -127,7 +129,9 @@ internal static partial class EnumerableExtension where TEntityOnly : class, IEntityOnly where TEntity : class, IReorderable { - return new ObservableReorderableDbCollection([.. source], serviceProvider); + return source is List list + ? new ObservableReorderableDbCollection(list, serviceProvider) + : new ObservableReorderableDbCollection([.. source], serviceProvider); } ///