/// <summary>
        /// Create a list of new entities
        /// </summary>
        /// <param name="entities">List of entities</param>
        /// <returns>Task</returns>
        public virtual async Task CreateManyAsync(IEnumerable <TEntity> entities)
        {
            var insertColumns = EntityColumns.Where(c => c != IdPropertyName);

            var insertCommand = $@"
INSERT INTO {TableName} ({string.Join(",", insertColumns)}) 
VALUES (@{string.Join(",@", insertColumns)})";

            await Connection.ExecuteAsync(insertCommand, entities.ToList());
        }
        /// <summary>
        /// Create a new entity
        /// </summary>
        /// <param name="entity">Entity</param>
        /// <returns>Task</returns>
        public virtual async Task CreateAsync(TEntity entity)
        {
            var insertColumns = EntityColumns.Where(c => !ExcludeProperty.Contains(c));

            var insertQuery = $@"INSERT INTO {TableName} ({string.Join(",", insertColumns)})
                                    VALUES (@{string.Join(",@", insertColumns)});
                                    {LastRowIdCommand}";

            IEnumerable <Guid?> result = await Connection.QueryAsync <Guid?>(insertQuery, entity);

            //EntityType.GetProperty(IdPropertyName)?
            //  .SetValue(entity, result.First());
        }
        /// <summary>
        /// Create a list of new entities
        /// </summary>
        /// <param name="entities">List of entities</param>
        /// <returns>Task</returns>
        public virtual async Task CreateManyAsync(IEnumerable <TEntity> entities)
        {
            if (Connection.State != ConnectionState.Open)
            {
                Connection.Open();
            }

            var parameters = EntityColumns
                             .Where(c => c != IdPropertyName)
                             .Select(c => "@" + c).ToList();

            await Connection.ExecuteAsync(
                $"EXEC Create{EntityTypeName} {string.Join(",", parameters)}",
                entities);
        }
        /// <summary>
        /// Update an existing entity
        /// </summary>
        /// <param name="entity">Entity</param>
        /// <returns>Task</returns>
        public virtual async Task UpdateAsync(TEntity entity)
        {
            if (Connection.State != ConnectionState.Open)
            {
                Connection.Open();
            }

            var columns    = EntityColumns.Where(s => s != IdPropertyName);
            var parameters = columns.Select(name => name + "=@" + name).ToList();

            var updateQuery = $@"UPDATE {TableName} 
                                    SET {string.Join(",", parameters)}
                                    WHERE {IdPropertyName}=@{IdPropertyName}";

            await Connection.ExecuteAsync(updateQuery, entity);
        }
        /// <summary>
        /// Create a list of new entities
        /// </summary>
        /// <param name="entities">List of entities</param>
        /// <returns>Task</returns>
        public virtual async Task CreateManyAsync(IEnumerable <TEntity> entities)
        {
            try
            {
                var insertColumns = EntityColumns.Where(c => !ExcludeProperty.Contains(c));

                var insertCommand = $@"INSERT INTO {TableName} ({string.Join(",", insertColumns)}) 
                                    VALUES (@{string.Join(",@", insertColumns)})";
                //IEnumerable<Guid?> result = await Connection.QueryAsync<Guid?>(insertCommand, entities);

                await Connection.ExecuteAsync(insertCommand, entities.ToList());
            }
            catch
            {
            }
        }
        /// <summary>
        /// Create a new entity
        /// </summary>
        /// <param name="entity">Entity</param>
        /// <returns>Task</returns>
        public virtual async Task CreateAsync(TEntity entity)
        {
            if (Connection.State != ConnectionState.Open)
            {
                Connection.Open();
            }

            var parameters = EntityColumns
                             .Where(c => c != IdPropertyName)
                             .Select(c => $"@{c}=@{c}").ToList();

            var createCommand = $"EXEC Create{EntityTypeName} {string.Join(",", parameters)}";

            IEnumerable <int> result = await Connection.QueryAsync <int>(
                createCommand,
                entity);

            EntityType.GetProperty(IdPropertyName)?
            .SetValue(entity, result.First());
        }