I believe you have a bug in your FluentData.DbCommand.QuerySingle<TEntity>(Action<Tentity, dynamic> customMapper) method.
You call QueryHandler like this:
item = new QueryHandler<TEntity>(Data).ExecuteSingle(customMapper, null)
but that is incorrect for the "Action<Tentity, dynamic> customMapper" type.
It should be
item = new QueryHandler<TEntity>(Data).ExecuteSingle(null, customMapper)
just like it is in FluentData.DbCommand.QueryMany.
This causes code like this to not work at all:
Product products = Context.Sql(@"select * from Product where ProductId = 1")
public void Custom_mapper_using_dynamic(Product product, dynamic row)
product.ProductId = row.ProductId;
product.Name = row.Name;
Inside Custom_mapper_using_dynamic, you will get an exception on the 1st line because the row object does not contain that data.
A workaround for is to use QueryMany and then just get back a List<> of size 1. But it would be better to fix QuerySingle.