From 6aeb7edc2bd9256224337352de6316eb6e51ef16 Mon Sep 17 00:00:00 2001 From: Francesco Lorenzo D'Amico Date: Mon, 2 Jun 2025 12:31:50 +0200 Subject: [PATCH] Build transaction on Method --- .../ShoppingList/ShoppingListRepository.cs | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/Francesco.Recipes.World/Repositories/ShoppingList/ShoppingListRepository.cs b/Francesco.Recipes.World/Repositories/ShoppingList/ShoppingListRepository.cs index be8bba1..fd814b1 100644 --- a/Francesco.Recipes.World/Repositories/ShoppingList/ShoppingListRepository.cs +++ b/Francesco.Recipes.World/Repositories/ShoppingList/ShoppingListRepository.cs @@ -2,7 +2,6 @@ { using Francesco.Recipes.World.Data; using Francesco.Recipes.World.Models.BackendModels.IngredientShoppingList; - using Francesco.Recipes.World.Models.BackendModels.Recipe; using Francesco.Recipes.World.Models.BackendModels.RecipeShoppingList; using Francesco.Recipes.World.Models.BackendModels.Shoppinglist; using Microsoft.EntityFrameworkCore; @@ -182,26 +181,38 @@ throw new ArgumentNullException(nameof(recipeIngredientShoppingListIds)); } - var affectedRecipeShoppingListIds = await _context.RecipeIngredientsShoppingLists - .Where(risl => recipeIngredientShoppingListIds.Contains(risl.Id)) - .Select(risl => risl.RecipeShoppingList.Id) - .Distinct() - .ToListAsync(); + using var transaction = await _context.Database.BeginTransactionAsync(); - foreach (var id in recipeIngredientShoppingListIds) + try { - var entry = await _context.RecipeIngredientsShoppingLists.FindAsync(id); - if (entry != null) + var affectedRecipeShoppingListIds = await _context.RecipeIngredientsShoppingLists + .Where(risl => recipeIngredientShoppingListIds.Contains(risl.Id)) + .Select(risl => risl.RecipeShoppingList.Id) + .Distinct() + .ToListAsync(); + + foreach (var id in recipeIngredientShoppingListIds) { - _context.RecipeIngredientsShoppingLists.Remove(entry); + var entry = await _context.RecipeIngredientsShoppingLists.FindAsync(id); + if (entry != null) + { + _context.RecipeIngredientsShoppingLists.Remove(entry); + } } + + await _context.SaveChangesAsync(); + + foreach (var recipeShoppingListId in affectedRecipeShoppingListIds) + { + await RemoveRecipeIfEmptyAsync(recipeShoppingListId); + } + + await transaction.CommitAsync(); } - - await _context.SaveChangesAsync(); - - foreach (var recipeShoppingListId in affectedRecipeShoppingListIds) + catch { - await RemoveRecipeIfEmptyAsync(recipeShoppingListId); + await transaction.RollbackAsync(); + throw; } }