public T Add(T value)
        {
            var cols  = value.CurrentColumns();
            var pkCol = cols.FirstOrDefault(x => x.IsPrimaryKey && !string.IsNullOrEmpty(x.SeqName));

            if (pkCol != null)
            {
                var seq = GetSeqValue(pkCol.SeqName);
                value.Id = seq;
            }

            IUnitOfWork localUnitOfWork = null;

            try
            {
                if (!UnitOfWorkFactory.IsActive)
                {
                    localUnitOfWork = UnitOfWorkFactory.Start();
                }
                var query = value.SqlInsert();
                UnitOfWorkFactory.Current.Connection.Execute(query, value);
            }
            finally
            {
                if (localUnitOfWork != null)
                {
                    UnitOfWorkFactory.Dispose();
                }
            }

            return(value);
        }
        private static IEnumerable <T> Select(string where = "", bool distinct = false)
        {
            var entity = new T();
            var query  = entity.SqlSelect(null, distinct);

            if (!string.IsNullOrEmpty(where))
            {
                query += " where " + where;
            }
            IUnitOfWork localUnitOfWork = null;
            List <T>    result;

            try
            {
                if (!UnitOfWorkFactory.IsActive)
                {
                    localUnitOfWork = UnitOfWorkFactory.Start();
                }
                result = UnitOfWorkFactory.Current.Connection.Query <T>(query).ToList();
            }
            finally
            {
                if (localUnitOfWork != null)
                {
                    UnitOfWorkFactory.Dispose();
                }
            }
            return(result);
        }
        public int GetSeqValue(string seqName)
        {
            var result = 0;

            if (string.IsNullOrEmpty(seqName))
            {
                return(result);
            }

            var         query           = $" SELECT NEXT VALUE FOR [Department].[dbo].{seqName} as 'Id'";
            IUnitOfWork localUnitOfWork = null;

            try
            {
                if (!UnitOfWorkFactory.IsActive)
                {
                    localUnitOfWork = UnitOfWorkFactory.Start();
                }
                var r = UnitOfWorkFactory.Current.Connection.Query <IdName>(query).FirstOrDefault();
                if (r != null)
                {
                    result = r.Id;
                }
            }
            finally
            {
                if (localUnitOfWork != null)
                {
                    UnitOfWorkFactory.Dispose();
                }
            }
            return(result);
        }
        public bool Delete(T value)
        {
            IUnitOfWork localUnitOfWork = null;

            try
            {
                if (!UnitOfWorkFactory.IsActive)
                {
                    localUnitOfWork = UnitOfWorkFactory.Start();
                }
                var query = value.SqlDelete();
                UnitOfWorkFactory.Current.Connection.Execute(query, value);

                if (GetItem(value.Id) == null)
                {
                    return(true);
                }
            }
            finally
            {
                if (localUnitOfWork != null)
                {
                    UnitOfWorkFactory.Dispose();
                }
            }

            return(false);
        }
        public T Update(T value, List <int> fieldsForUpdate)
        {
            IUnitOfWork localUnitOfWork = null;

            try
            {
                if (!UnitOfWorkFactory.IsActive)
                {
                    localUnitOfWork = UnitOfWorkFactory.Start();
                }
                var query = value.SqlUpdate(fieldsForUpdate);
                UnitOfWorkFactory.Current.Connection.Execute(query, value);
            }
            finally
            {
                if (localUnitOfWork != null)
                {
                    UnitOfWorkFactory.Dispose();
                }
            }
            return(value);
        }