/// <summary>
        /// Create DataBase if not exist
        /// </summary>
        protected void CreateDataBase()
        {
            lock (this)
            {
                if (DataBaseExist())
                {
                    return;
                }

                var sqlBuild = new TransactionConnectionString(DataBaseTypes, ConnectionString);
                if (string.IsNullOrEmpty(sqlBuild.InitialCatalog))
                {
                    throw new EntityException("InitialCatalog, Database or DataSource  can not be null or empty");
                }
                var dbName = sqlBuild.InitialCatalog;
                if (DataBaseTypes == DataBaseTypes.Mssql)
                {
                    sqlBuild.InitialCatalog = "";
                    using (var rep = new DbRepository(sqlBuild.ToString(), DataBaseTypes))
                        rep.GetSqlCommand($"Create DataBase [{dbName.Trim()}]").ExecuteNonQuery();
                }
                else if (DataBaseTypes == DataBaseTypes.Sqllight)
                {
                    File.Create(sqlBuild.ToString().Trim()).Close();
                }
                else
                {
                    sqlBuild.InitialCatalog = "";
                    using (var rep = new DbRepository(sqlBuild.ToString(), DataBaseTypes))
                        rep.GetSqlCommand($"Create DataBase {dbName}").ExecuteNonQuery();
                }

                var latestChanges = GetCodeLatestChanges();
                if (latestChanges.Any())
                {
                    latestChanges.Execute(true);
                }
            }
        }
        /// <summary>
        /// Validate if database exist
        /// </summary>
        /// <returns></returns>
        protected bool DataBaseExist()
        {
            var sqlBuild = new TransactionConnectionString(DataBaseTypes, ConnectionString);

            if (string.IsNullOrEmpty(sqlBuild.InitialCatalog))
            {
                throw new EntityException("InitialCatalog, Database or DataSource  can not be null or empty");
            }

            var dbName = sqlBuild.InitialCatalog;

            if (DataBaseTypes == DataBaseTypes.Mssql)
            {
                sqlBuild.InitialCatalog = "";
                using (var rep = new DbRepository(sqlBuild.ToString(), DataBaseTypes))
                    return(rep.GetSqlCommand($"SELECT  CAST(CASE WHEN db_id(String[{dbName}]) is not null THEN 1 ELSE 0 END AS BIT)").ExecuteScalar().ConvertValue <bool>());
            }
            else if (DataBaseTypes == DataBaseTypes.Sqllight)
            {
                try
                {
                    using (var rep = new DbRepository(sqlBuild.ToString(), DataBaseTypes))
                        rep.ValidateConnection();
                    return(true);
                }
                catch
                {
                    return(false);
                }
            }
            else
            {
                sqlBuild.InitialCatalog = "";
                using (var rep = new DbRepository(sqlBuild.ToString(), DataBaseTypes))
                    return(rep.GetSqlCommand($"SELECT CAST(CASE WHEN datname is not null THEN 1 ELSE 0 END AS BIT) from pg_database WHERE lower(datname) = lower(String[{dbName}])").ExecuteScalar().ConvertValue <bool>());
            }
        }