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) string? language = null)
{ {
var trimmedUrl = url.Trim(); var trimmedUrl = url.Trim();
var cleanUrl = trimmedUrl.TrimEnd('.', '/');
var existingArticle = await _context.NewsArticles 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) if (existingArticle != null)
{ {
@@ -160,21 +161,14 @@ public class NewsDbService : INewsDbService
} }
catch (DbUpdateException ex) catch (DbUpdateException ex)
{ {
_context.Entry(article).State = EntityState.Detached; _context.ChangeTracker.Clear();
if (article.MatchedAssets != null)
{
foreach (var match in article.MatchedAssets)
{
_context.Entry(match).State = EntityState.Detached;
}
}
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); 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) if (existing != null)
{ {
return existing; return existing;
} }
throw; return article;
} }
return article; return article;