fix(news): normalize URL and clear change tracker on insert conflict to prevent concurrency exception
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user