public ParameterizedSql GetSqlForSave <T>(T entity, EntityMapping <T> mapping)
        {
            if (mapping.IsPrimaryKeyDefaultValue(entity) == false)
            {
                throw new InvalidOperationException($"Entity of type {entity.GetType()} and id {mapping.GetPrimaryKeyValue(entity)} is already saved. Please use SaveOrUpdate or Update.");
            }

            var parameters = this.GetParametersForMapping(entity, mapping).ToList();

            var builder = new StringBuilder()
                          .Append("INSERT INTO ")
                          .Append(mapping.TableName)
                          .Append(" (")
                          .AppendJoin(", ", parameters.Select(f => f.ColumnName))
                          .Append(") VALUES ( ")
                          .AppendJoin(", ", parameters.Select(f => f.ParameterName))
                          .Append(");");

            return(new ParameterizedSql
            {
                Sql = builder.ToString(),
                Parameters = parameters
            });
        }
        public ParameterizedSql GetSqlForUpdate <T>(T entity, EntityMapping <T> mapping)
        {
            if (mapping.IsPrimaryKeyDefaultValue(entity))
            {
                throw new InvalidOperationException($"Entity of type {entity.GetType()} is not yet saved and cannot be updated. Please use SaveOrUpdate or Save.");
            }

            var parameters = this.GetParametersForMapping(entity, mapping).ToList();

            var builder = new StringBuilder()
                          .Append("UPDATE ")
                          .Append(mapping.TableName)
                          .Append(" SET ")
                          .AppendJoin(", ", parameters.Select(f => $"{f.ColumnName} = {f.ParameterName}").ToList())
                          .Append(" WHERE ")
                          .Append($" {mapping.PrimaryKeyPropertyMapping.ColumnName} = {mapping.GetPrimaryKeyValue(entity)}");

            return(new ParameterizedSql
            {
                Sql = builder.ToString(),
                Parameters = parameters
            });
        }