/// <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));
        }
예제 #2
0
 /// <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));
 }
예제 #3
0
 /// <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));
 }
예제 #4
0
        /// <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));
        }
예제 #5
0
        /// <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));
        }