public bool Delete <T>(IDbConnection connection, T entity, IDbTransaction transaction, int?commandTimeout) where T : class
        {
            IClassMapper classMap  = SqlGenerator.Configuration.GetMap <T>();
            IPredicate   predicate = KeyPredicateConvert.GetKeyPredicate <T>(classMap, entity);

            return(Delete <T>(connection, classMap, predicate, transaction, commandTimeout));
        }
        public bool Update <T>(IDbConnection connection, T entity, IDbTransaction transaction, int?commandTimeout) where T : class
        {
            IClassMapper classMap  = SqlGenerator.Configuration.GetMap <T>();
            IPredicate   predicate = KeyPredicateConvert.GetKeyPredicate <T>(classMap, entity);
            Dictionary <string, object> parameters = new Dictionary <string, object>();
            string            sql = SqlGenerator.Update(classMap, predicate, parameters);
            DynamicParameters dynamicParameters = new DynamicParameters();

            var columns = classMap.Properties.Where(p => !(p.Ignored || p.IsReadOnly || p.KeyType == KeyType.Identity));

            foreach (var property in ReflectionHelper.GetObjectValues(entity).Where(property => columns.Any(c => c.Name == property.Key)))
            {
                dynamicParameters.Add(property.Key, property.Value);
            }

            foreach (var parameter in parameters)
            {
                dynamicParameters.Add(parameter.Key, parameter.Value);
            }

            return(connection.Execute(sql, dynamicParameters, transaction, commandTimeout, CommandType.Text) > 0);
        }