From 6084e29d47135a6ec28bb341bbe77394188f103f Mon Sep 17 00:00:00 2001 From: raymonddenhaan <155616759+raymonddenhaan@users.noreply.github.com> Date: Fri, 8 Mar 2024 14:25:40 +0100 Subject: [PATCH] Reverted bulk implementation (#5047) --- .../Extensions/QueryableExtensions.cs | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/modules/Elsa.EntityFrameworkCore.Common/Extensions/QueryableExtensions.cs b/src/modules/Elsa.EntityFrameworkCore.Common/Extensions/QueryableExtensions.cs index c0b815617..28be0c676 100644 --- a/src/modules/Elsa.EntityFrameworkCore.Common/Extensions/QueryableExtensions.cs +++ b/src/modules/Elsa.EntityFrameworkCore.Common/Extensions/QueryableExtensions.cs @@ -1,5 +1,4 @@ using System.Linq.Expressions; -using EFCore.BulkExtensions; using Elsa.Common.Models; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; @@ -18,10 +17,24 @@ public static class QueryableExtensions /// public static async Task BulkUpsertAsync(this TDbContext dbContext, IList entities, Expression> keySelector, CancellationToken cancellationToken = default) where TDbContext : DbContext where TEntity : class { - await dbContext.BulkInsertOrUpdateAsync(entities, new BulkConfig - { - EnableShadowProperties = true - }, cancellationToken: cancellationToken); + var set = dbContext.Set(); + var compiledKeySelector = keySelector.Compile(); + var containsLambda = entities.Any() ? keySelector.BuildContainsExpression(entities) : default; + var existingEntitiesQuery = set.AsNoTracking(); + + if (containsLambda != null) + existingEntitiesQuery = existingEntitiesQuery.Where(containsLambda); + + var existingEntities = await existingEntitiesQuery.ToListAsync(cancellationToken); + var entitiesToUpdate = entities.IntersectBy(existingEntities.Select(compiledKeySelector), compiledKeySelector).ToList(); + var entitiesToInsert = entities.Except(entitiesToUpdate).ToList(); + + if (entitiesToUpdate.Any()) + set.UpdateRange(entitiesToUpdate); + if (entitiesToInsert.Any()) + await set.AddRangeAsync(entitiesToInsert, cancellationToken); + + await dbContext.SaveChangesAsync(cancellationToken); } ///