public static MappedDynamicParameters GetParameters <TEntity>(
            this DbContext context,
            TEntity entity
            )
        {
            var entityType = context.Model.FindEntityType(typeof(TEntity));

            if (entityType == null)
            {
                throw new InvalidOperationException($"Entity of type {typeof(TEntity).FullName} is not registered in DbContext. Use overload with table name and schema");
            }

            var parameters = new MappedDynamicParameters();

            foreach (var p in entityType.GetProperties())
            {
                var typeMapping    = p.FindRelationalMapping();
                var valueConverter = p.GetValueConverter() ?? typeMapping.Converter;

                var columnName = p.GetColumnName();
                parameters.PropertyToColumnMapping.Add(p.Name, columnName);
                parameters.ColumnToParameterMapping.Add(columnName, columnName);

                if (p.IsShadowProperty())
                {
                    var generator = p.GetValueGeneratorFactory().Invoke(p, entityType);
                    // this only supports simple generators, where passed entity is not used!
                    var val = generator.Next(null);
                    parameters.Add(
                        columnName,
                        valueConverter != null ? valueConverter.ConvertToProvider(val) : val,
                        typeMapping.DbType,
                        size: typeMapping.Size
                        );
                    continue;
                }

                parameters.Add(
                    columnName,
                    valueConverter != null
                                                ? valueConverter.ConvertToProvider(p.GetGetter().GetClrValue(entity))
                                                : p
                    .GetGetter()
                    .GetClrValue(entity),
                    typeMapping.DbType,
                    size: typeMapping.Size
                    );
            }

            return(parameters);
        }
        public static async Task InsertAsync <TEntity>(this DapperHybridContext context, string schema, string table, TEntity entity)
        {
            var connection = context.Database.GetDbConnection();
            var parameters = new MappedDynamicParameters(entity);

            var statement = context.CreateSqlGenerator <TEntity>().Insert(schema, table, parameters.ColumnToParameterMapping);

            await connection.ExecuteAsync(
                statement.Statement,
                parameters,
                transaction : context.Database.CurrentTransaction?.GetDbTransaction()
                )
            .ConfigureAwait(false);
        }