58 lines
1.7 KiB
C#
58 lines
1.7 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace StellaOps.Provcache.Postgres;
|
|
|
|
public sealed partial class PostgresProvcacheRepository
|
|
{
|
|
/// <inheritdoc />
|
|
public async Task UpsertAsync(ProvcacheEntry entry, CancellationToken cancellationToken = default)
|
|
{
|
|
var entity = MapToEntity(entry);
|
|
|
|
var existing = await _context.ProvcacheItems
|
|
.FirstOrDefaultAsync(e => e.VeriKey == entry.VeriKey, cancellationToken)
|
|
.ConfigureAwait(false);
|
|
|
|
if (existing is null)
|
|
{
|
|
_context.ProvcacheItems.Add(entity);
|
|
}
|
|
else
|
|
{
|
|
_context.Entry(existing).CurrentValues.SetValues(entity);
|
|
}
|
|
|
|
await _context.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public async Task UpsertManyAsync(IEnumerable<ProvcacheEntry> entries, CancellationToken cancellationToken = default)
|
|
{
|
|
var entryList = entries.ToList();
|
|
if (entryList.Count == 0)
|
|
return;
|
|
|
|
var veriKeys = entryList.Select(e => e.VeriKey).ToList();
|
|
var existing = await _context.ProvcacheItems
|
|
.Where(e => veriKeys.Contains(e.VeriKey))
|
|
.ToDictionaryAsync(e => e.VeriKey, cancellationToken)
|
|
.ConfigureAwait(false);
|
|
|
|
foreach (var entry in entryList)
|
|
{
|
|
var entity = MapToEntity(entry);
|
|
|
|
if (existing.TryGetValue(entry.VeriKey, out var existingEntity))
|
|
{
|
|
_context.Entry(existingEntity).CurrentValues.SetValues(entity);
|
|
}
|
|
else
|
|
{
|
|
_context.ProvcacheItems.Add(entity);
|
|
}
|
|
}
|
|
|
|
await _context.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
|
|
}
|
|
}
|