fix(news): normalize URL and clear change tracker on insert conflict to prevent concurrency exception

This commit is contained in:
2026-08-16 14:16:02 +02:00
parent b5cc70c08c
commit d8ba28a810
+5 -11
View File
@@ -104,9 +104,10 @@ public class NewsDbService : INewsDbService
string? language = null)
{
var trimmedUrl = url.Trim();
var cleanUrl = trimmedUrl.TrimEnd('.', '/');
var existingArticle = await _context.NewsArticles
.FirstOrDefaultAsync(a => a.SourceUrl == trimmedUrl);
.FirstOrDefaultAsync(a => a.SourceUrl == trimmedUrl || a.SourceUrl == cleanUrl || a.SourceUrl.StartsWith(cleanUrl));
if (existingArticle != null)
{
@@ -160,21 +161,14 @@ public class NewsDbService : INewsDbService
}
catch (DbUpdateException ex)
{
_context.Entry(article).State = EntityState.Detached;
if (article.MatchedAssets != null)
{
foreach (var match in article.MatchedAssets)
{
_context.Entry(match).State = EntityState.Detached;
}
}
_context.ChangeTracker.Clear();
await _finlyticLogger.LogWarningAsync(SettingKeys.NewsChannel, "[NewsChannel] Unique constraint or concurrency hit during insert for URL: {Url}. Fetching existing fallback. ({Message})", trimmedUrl, ex.InnerException?.Message ?? ex.Message);
var existing = await _context.NewsArticles.AsNoTracking().FirstOrDefaultAsync(a => a.SourceUrl == trimmedUrl);
var existing = await _context.NewsArticles.AsNoTracking().FirstOrDefaultAsync(a => a.SourceUrl == trimmedUrl || a.SourceUrl == cleanUrl || a.SourceUrl.StartsWith(cleanUrl));
if (existing != null)
{
return existing;
}
throw;
return article;
}
return article;