Fix: Work around EF Core 9 + SQLite json_each bug preventing variant loading

This commit is contained in:
SysAdmin 2025-10-05 16:41:42 +01:00
parent 3a2ef481b0
commit 7dbdc0d46f

View File

@ -27,22 +27,26 @@ public class ProductService : IProductService
Console.WriteLine($"[DEBUG] Loaded {products.Count} products"); Console.WriteLine($"[DEBUG] Loaded {products.Count} products");
// Manually load variants for all products // Manually load variants - using fresh query context to avoid Contains() json_each bug in EF Core 9 + SQLite
var productIds = products.Select(p => p.Id).ToList(); // Load ALL active variants first, then filter in memory
Console.WriteLine($"[DEBUG] Product IDs: {string.Join(", ", productIds.Select(id => id.ToString()))}");
var allVariants = await _context.ProductVariants var allVariants = await _context.ProductVariants
.Where(v => productIds.Contains(v.ProductId)) .Where(v => v.IsActive)
.ToListAsync(); .ToListAsync();
Console.WriteLine($"[DEBUG] Loaded {allVariants.Count} total variants from database"); Console.WriteLine($"[DEBUG] Loaded {allVariants.Count} total variants from database");
foreach (var v in allVariants.Take(5))
// Filter to only variants that belong to loaded products
var productIds = products.Select(p => p.Id).ToHashSet();
var matchingVariants = allVariants.Where(v => productIds.Contains(v.ProductId)).ToList();
Console.WriteLine($"[DEBUG] Filtered to {matchingVariants.Count} variants matching {productIds.Count} products");
foreach (var v in matchingVariants.Take(5))
{ {
Console.WriteLine($"[DEBUG] - Variant: {v.Id}, ProductId: {v.ProductId}, Type: {v.VariantType}, Name: {v.Name}"); Console.WriteLine($"[DEBUG] - Variant: {v.Id}, ProductId: {v.ProductId}, Type: {v.VariantType}, Name: {v.Name}");
} }
// Group variants by ProductId for quick lookup // Group variants by ProductId for quick lookup
var variantsByProduct = allVariants.GroupBy(v => v.ProductId) var variantsByProduct = matchingVariants.GroupBy(v => v.ProductId)
.ToDictionary(g => g.Key, g => g.ToList()); .ToDictionary(g => g.Key, g => g.ToList());
Console.WriteLine($"[DEBUG] Grouped variants into {variantsByProduct.Count} product groups"); Console.WriteLine($"[DEBUG] Grouped variants into {variantsByProduct.Count} product groups");
@ -110,14 +114,18 @@ public class ProductService : IProductService
.Where(p => p.IsActive && p.CategoryId == categoryId) .Where(p => p.IsActive && p.CategoryId == categoryId)
.ToListAsync(); .ToListAsync();
// Manually load variants for all products // Manually load variants - using fresh query context to avoid Contains() json_each bug in EF Core 9 + SQLite
var productIds = products.Select(p => p.Id).ToList(); // Load ALL active variants first, then filter in memory
var allVariants = await _context.ProductVariants var allVariants = await _context.ProductVariants
.Where(v => productIds.Contains(v.ProductId)) .Where(v => v.IsActive)
.ToListAsync(); .ToListAsync();
// Filter to only variants that belong to loaded products
var productIds = products.Select(p => p.Id).ToHashSet();
var matchingVariants = allVariants.Where(v => productIds.Contains(v.ProductId)).ToList();
// Group variants by ProductId for quick lookup // Group variants by ProductId for quick lookup
var variantsByProduct = allVariants.GroupBy(v => v.ProductId) var variantsByProduct = matchingVariants.GroupBy(v => v.ProductId)
.ToDictionary(g => g.Key, g => g.ToList()); .ToDictionary(g => g.Key, g => g.ToList());
return products.Select(p => new ProductDto return products.Select(p => new ProductDto