/// <summary> /// Enables the mutation of database entities via a <see cref="DbContext"/>. /// </summary> /// <remarks> /// This will call <see cref="DbContext.SaveChangesAsync(CancellationToken)"/> after /// executing the executor function if <see cref="EFCoreContextContainerOptions.AutoSaveChanges"/> is /// set to 'true'. /// </remarks> /// <typeparam name="TParam">The parameter type</typeparam> /// <param name="container"></param> /// <param name="executor"></param> /// <param name="param"></param> /// <param name="ct"></param> /// <returns></returns> /// <exception cref="ArgumentNullException" /> public static Task ExecuteAsync <TParam>( this EFCoreContextContainer container, Func <DbContext, TParam, CancellationToken, Task> executor, TParam param, CancellationToken ct ) { if (container == null) { throw new ArgumentNullException(nameof(container)); } if (executor == null) { throw new ArgumentNullException(nameof(executor)); } #if NETSTANDARD2_1 var innerParam = (param, executor); #else var innerParam = new { param, executor }; #endif return(container.ExecuteAsync(async(ctx, p, c) => { await p.executor(ctx, p.param, c); return 0; }, innerParam, ct)); }
/// <inheritdoc /> public async Task <TEntity> CreateAsync(TEntity entity, CancellationToken ct) { return(await _container.ExecuteAsync(async (ctx, single, c) => { var entry = await ctx.Set <TEntity>().AddAsync(single, c); return entry.Entity; }, entity, ct)); }
/// <inheritdoc /> public async Task <TEntity> UpdateAsync(TEntity entity, CancellationToken ct) { return(await _container.ExecuteAsync((ctx, single, c) => { var entry = ctx.Set <TEntity>().Update(single); return Task.FromResult(entry.Entity); }, entity, ct)); }
/// <inheritdoc /> public async Task <IEnumerable <TEntity> > DeleteAsync(IEnumerable <TEntity> entities, CancellationToken ct) { if (entities == null) { throw new ArgumentNullException(nameof(entities)); } return(await _container.ExecuteAsync((ctx, collection, c) => { ctx.Set <TEntity>().RemoveRange(collection); return Task.FromResult(collection); }, entities as IReadOnlyCollection <TEntity> ?? entities.ToList(), ct)); }
/// <inheritdoc /> public async Task <IEnumerable <TEntity> > CreateAsync(IEnumerable <TEntity> entities, CancellationToken ct) { if (entities == null) { throw new ArgumentNullException(nameof(entities)); } return(await _container.ExecuteAsync(async (ctx, collection, c) => { await ctx.Set <TEntity>().AddRangeAsync(collection, c); return collection; }, entities as IReadOnlyCollection <TEntity> ?? entities.ToList(), ct)); }
/// <summary> /// Enables the mutation of database entities via a <see cref="DbContext"/>. /// </summary> /// <remarks> /// This will call <see cref="DbContext.SaveChangesAsync(CancellationToken)"/> after /// executing the executor function if <see cref="EFCoreContextContainerOptions.AutoSaveChanges"/> is /// set to 'true'. /// </remarks> /// <typeparam name="TResult">The result type</typeparam> /// <param name="container"></param> /// <param name="executor"></param> /// <param name="ct"></param> /// <returns></returns> /// <exception cref="ArgumentNullException" /> public static Task <TResult> ExecuteAsync <TResult>( this EFCoreContextContainer container, Func <DbContext, CancellationToken, Task <TResult> > executor, CancellationToken ct ) { if (container == null) { throw new ArgumentNullException(nameof(container)); } if (executor == null) { throw new ArgumentNullException(nameof(executor)); } return(container.ExecuteAsync((ctx, exec, c) => exec(ctx, c), executor, ct)); }
/// <summary> /// Enables the mutation of database entities via a <see cref="DbContext"/>. /// </summary> /// <remarks> /// This will call <see cref="DbContext.SaveChangesAsync(CancellationToken)"/> after /// executing the executor function if <see cref="EFCoreContextContainerOptions.AutoSaveChanges"/> is /// set to 'true'. /// </remarks> /// <param name="container"></param> /// <param name="executor"></param> /// <param name="ct"></param> /// <returns></returns> /// <exception cref="ArgumentNullException" /> public static Task ExecuteAsync( this EFCoreContextContainer container, Func <DbContext, CancellationToken, Task> executor, CancellationToken ct ) { if (container == null) { throw new ArgumentNullException(nameof(container)); } if (executor == null) { throw new ArgumentNullException(nameof(executor)); } return(container.ExecuteAsync(async(ctx, exec, c) => { await exec(ctx, c); return 0; }, executor, ct)); }