/// <summary>
        /// Creates a command factory which can be used to create entities for multiple inserts each returning the primary key.
        /// </summary>
        public static string MakeInsertRangeCommand <TEntity, TPrimaryKey>(IEnumerable <TEntity> entities, IDialect dialect)
        {
            Ensure.NotNull(entities, nameof(entities));
            var config = MicroCRUDConfig.Current;

            dialect = dialect ?? config.Dialect;

            var tableSchema = TableSchemaFactory.GetTableSchema(typeof(TEntity), dialect, config.SchemaFactory);

            if (!tableSchema.CanGeneratePrimaryKey(typeof(TPrimaryKey)))
            {
                throw new InvalidPrimaryKeyException(
                          "InsertRange<TEntity, TPrimaryKey>() can only be used for Int32 and Int64 primary keys. Use InsertRange<TEntity>() for other types of primary keys.");
            }

            return(dialect.MakeInsertReturningIdentityStatement(tableSchema));
        }
        /// <summary>
        /// Creates a command which will insert an entity, returning the primary key.
        /// </summary>
        public static CommandDefinition MakeInsertReturningPrimaryKeyCommand <TPrimaryKey>(
            object entity,
            IDbTransaction transaction,
            IDialect dialect,
            int?commandTimeout,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            Ensure.NotNull(entity, nameof(entity));
            var config = MicroCRUDConfig.Current;

            dialect = dialect ?? config.Dialect;

            var tableSchema = TableSchemaFactory.GetTableSchema(entity.GetType(), dialect, config.SchemaFactory);

            if (!tableSchema.CanGeneratePrimaryKey(typeof(TPrimaryKey)))
            {
                throw new InvalidPrimaryKeyException(
                          "Insert<TPrimaryKey>() can only be used for Int32 and Int64 primary keys. Use Insert() for other types of primary keys.");
            }

            var sql = dialect.MakeInsertReturningIdentityStatement(tableSchema);

            return(MakeCommandDefinition(sql, entity, transaction, commandTimeout, cancellationToken));
        }