using System.Threading.Tasks;
using System.Collections;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
public static void Main()
Console.WriteLine("Hello World");
public static async Task UpsertRangeSafe<T>(this DbSet<T> dbSet, IEnumerable<T> items, Func<T,object> findKey, Action<T> onUpdateDbItem) where T : class
foreach (var item in items)
var dbItem = await dbSet.FindAsync(key).ConfigureAwait(false);
await new UpsertBuilder<T>(dbSet, items)
public interface Builder<T> where T : class
public class UpsertBuilder<T> where T : class
private Func<T,object> _findKey;
private Func<T> _onUpdate;
private readonly IEnumerable<T> _items;
private readonly DbSet<T> _dbSet;
public UpsertBuilder(DbSet<T> dbSet, IEnumerable<T> items)
public UpsertBuilder<T> On(Func<T,object> findKey)
public UpsertBuilder<T> OnUpdate(Func<T> onUpdate)
public async Task RunAsync()
foreach (var item in _items)
var key = _findKey(item);
var dbItem = await _dbSet.FindAsync(key).ConfigureAwait(false);
throw new ArgumentNullException(nameof(_items));
throw new ArgumentNullException(nameof(_onUpdate));
throw new ArgumentNullException(nameof(_findKey));