public GeraMapeamentos(TipoDeBancoDados tipoDeBancoDados)
        {
            _tipoDeBancoDados = tipoDeBancoDados;
            _tabelasECampos = TabelasECamposFactory.GetTabelasECampos(_tipoDeBancoDados);
            _convertParaTipoCShap = new ConvertParaTipoCShap(_tipoDeBancoDados);

            if (_tipoDeBancoDados == TipoDeBancoDados.Sqlserver)
            {
                _abre = "[";
                _fecha = "]";
            }
        }
        private void GeraGetSet(string NomeDaTabela, TrataNome tratanome, ITabelasECampos tabelasecampos, List<string> Listacampos, StreamWriter aFile, bool RetiraS, bool PropriedadesAutomaticas)
        {
            aFile.Write("\n");
            var count = tabelasecampos.CamposChavesDaTabela(NomeDaTabela).Count;
            if (count > 1)
            {
                aFile.Write("\t\tpublic virtual PK Pk");
                if (!PropriedadesAutomaticas)
                {
                    aFile.Write("\n");
                    aFile.WriteLine("\t\t{");
                    aFile.WriteLine("\t\t\tget { return this.pk; }");
                    aFile.WriteLine("\t\t\tset { pk = value; }");
                    aFile.WriteLine("\t\t}");
                    aFile.Write("\n");
                }
                else
                {
                    aFile.Write(" { get; set; }\n");
                }
            }

            foreach (string campos in Listacampos)
            {
                if (count == 1 || !tabelasecampos.CampoChavesDaTabela(NomeDaTabela, campos))
                {
                    string linha;
                    if (tabelasecampos.NomeDaTabelaDaChaveEstrgeira(NomeDaTabela, campos) != "NULL")
                    {
                        linha = "        public virtual " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(tabelasecampos.NomeDaTabelaDaChaveEstrgeira(NomeDaTabela, campos), RetiraS) +
                            " " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(campos.ToLower(), RetiraS);
                        aFile.Write(linha);
                        if (!PropriedadesAutomaticas)
                        {
                            aFile.Write("\n");
                            aFile.Write("        {\n");
                            aFile.Write("            get{ return this." + tratanome.ConverteParaMinusculoERetiraUnderline(campos.ToLower(), RetiraS) + "; }\n");
                            aFile.Write("            set{ this." + tratanome.ConverteParaMinusculoERetiraUnderline(campos.ToLower(), RetiraS) + " = value; }\n");
                            aFile.Write("        }\n");
                            aFile.Write("\n");
                        }
                        else
                        {
                            aFile.Write(" { get; set; }\n");

                        }

                    }
                    else
                    {

                        linha = "        public virtual " + tabelasecampos.TipoDadoCSharp(NomeDaTabela, campos) +
                            " " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(campos.ToLower(), RetiraS);
                        aFile.Write(linha);
                        if (!PropriedadesAutomaticas)
                        {
                            aFile.Write("\n");
                            aFile.Write("        {\n");
                            aFile.Write("            get{ return this." + tratanome.ConverteParaMinusculoERetiraUnderline(campos.ToLower(), RetiraS) + "; }\n");
                            aFile.Write("            set{ this." + tratanome.ConverteParaMinusculoERetiraUnderline(campos.ToLower(), RetiraS) + " = value; }\n");
                            aFile.Write("        }\n");
                            aFile.Write("\n");
                        }
                        else
                        {
                            aFile.Write(" { get; set; }\n");

                        }
                    }

                }

            }
            string nomedatabelapassou = string.Empty;
            int i = 0;
            foreach (string tabela in tabelasecampos.TabelasOndeARelacionamento(NomeDaTabela))
            {
                if (nomedatabelapassou == tabela)
                {
                    i += 1;
                    nomedatabelapassou = tabela;
                }
                else
                {
                    i = 0;
                    nomedatabelapassou = tabela;
                }
                if (i > 0)
                {

                    aFile.Write("        public virtual IList<" + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(tabela, RetiraS) +
                         "> " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(tabelasecampos.CamposChavesEstrageiraDaTabela(tabela)[i], RetiraS) + "List");

                    if (!PropriedadesAutomaticas)
                    {
                        aFile.Write("\n");
                        aFile.Write("        {\n");
                        aFile.Write("            get{ return this." + tratanome.ConverteParaMinusculoERetiraUnderline(tabelasecampos.CamposChavesEstrageiraDaTabela(tabela)[i], RetiraS) + "List; }\n");
                        aFile.Write("            set{ this." + tratanome.ConverteParaMinusculoERetiraUnderline(tabelasecampos.CamposChavesEstrageiraDaTabela(tabela)[i], RetiraS) + "List = value; }\n");
                        aFile.Write("        }\n");
                        aFile.Write("\n");
                    }
                    else
                    {
                        aFile.Write(" { get; set; }\n");

                    }

                }
                else
                {

                    aFile.Write("        public virtual IList<" + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(tabela, RetiraS) +
                    "> " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(tabela, RetiraS) + "List");
                    if (!PropriedadesAutomaticas)
                    {
                        aFile.Write("\n");
                        aFile.Write("        {\n");
                        aFile.Write("            get{ return this." + tratanome.ConverteParaMinusculoERetiraUnderline(tabela, RetiraS) + "List; }\n");
                        aFile.Write("            set{ this." + tratanome.ConverteParaMinusculoERetiraUnderline(tabela, RetiraS) + "List = value; }\n");
                        aFile.Write("        }\n");
                        aFile.Write("\n");
                    }
                    else
                    {
                        aFile.Write(" { get; set; }\n");

                    }

                }

            }

            aFile.Write("\n");
        }
        private void GeraConstrutores(string NomeDaTabela, TrataNome tratanome, ITabelasECampos tabelasecampos, List<string> Listacampos, StreamWriter aFile, bool RetiraS)
        {
            aFile.Write("\n");
            aFile.Write("        public " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(NomeDaTabela, RetiraS) + "()\n");
            aFile.Write("        {\n");
            aFile.Write("        }\n\n");

            aFile.Write("        public " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(NomeDaTabela, RetiraS) + "(");
            string linha = string.Empty;
            var count = tabelasecampos.CamposChavesDaTabela(NomeDaTabela).Count;
            bool verificaparametro = true;
            bool verificathis = true;
            foreach (string campo in Listacampos)
            {
                if (count > 1 && verificaparametro)
                {
                    linha += "PK Pk, ";

                    verificaparametro = false;
                }

                if (count == 1 || !tabelasecampos.CampoChavesDaTabela(NomeDaTabela, campo))
                {

                    if (tabelasecampos.NomeDaTabelaDaChaveEstrgeira(NomeDaTabela, campo) != "NULL")
                    {
                        linha += tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(tabelasecampos.NomeDaTabelaDaChaveEstrgeira(NomeDaTabela, campo), RetiraS)
                            + " " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(campo, RetiraS) + ", ";
                    }
                    else
                    {
                        linha += tabelasecampos.TipoDadoCSharp(NomeDaTabela, campo) + " " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(campo, RetiraS) + ", ";
                    }
                }

            }

            linha = linha.Substring(0, linha.Length - 2);
            aFile.Write(linha);
            aFile.Write(")\n");
            aFile.Write("        {\n");

            foreach (string campo in Listacampos)
            {

                if (count > 1 && verificathis)
                {
                    aFile.Write("            this.Pk = Pk;\n");

                    verificathis = false;
                }

                if (count == 1 || !tabelasecampos.CampoChavesDaTabela(NomeDaTabela, campo))
                {

                    aFile.Write("            this." + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(campo, RetiraS) +
                        " = " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(campo, RetiraS) + ";\n");
                }
            }

            aFile.Write("        }");

            aFile.Write("\n");
        }
        private void GeraClassePK(string NomeDaTabela, TrataNome tratanome, ITabelasECampos tabelasecampos, StreamWriter aFile, bool RetiraS, bool PropriedadesAutomaticas)
        {
            aFile.WriteLine("\t\t[Serializable]");
            aFile.WriteLine("\t\tpublic class PK");
            aFile.WriteLine("\t\t{");
            string linha = string.Empty;
            if (!PropriedadesAutomaticas)
            {
                foreach (string campos in tabelasecampos.CamposChavesDaTabela(NomeDaTabela))
                {
                    if (tabelasecampos.NomeDaTabelaDaChaveEstrgeira(NomeDaTabela, campos) != "NULL")
                    {

                        linha = "\t\t\tprivate " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(tabelasecampos.NomeDaTabelaDaChaveEstrgeira(NomeDaTabela, campos), RetiraS) +
                           " " + tratanome.ConverteParaMinusculoERetiraUnderline(campos.ToLower(), RetiraS) + ";\n";
                    }
                    else
                    {
                        linha = "\t\t\tprivate " + tabelasecampos.TipoDadoCSharp(NomeDaTabela, campos) +
                           " " + tratanome.ConverteParaMinusculoERetiraUnderline(campos.ToLower(), RetiraS) + ";\n";
                    }
                    aFile.Write(linha);
                }
                aFile.Write("\n");
            }

            //Contrutores

            aFile.Write("\t        public PK()\n");
            aFile.Write("\t        {\n");
            aFile.Write("\t        }\n\n");

            aFile.Write("\t        public PK(");
            linha = string.Empty;
            foreach (string campo in tabelasecampos.CamposChavesDaTabela(NomeDaTabela))
            {

                if (tabelasecampos.NomeDaTabelaDaChaveEstrgeira(NomeDaTabela, campo) != "NULL")
                {
                    linha += tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(tabelasecampos.NomeDaTabelaDaChaveEstrgeira(NomeDaTabela, campo), RetiraS)
                        + " " + tratanome.ConverteParaMinusculoERetiraUnderline(campo, RetiraS) + ", ";
                }
                else
                {
                    linha += tabelasecampos.TipoDadoCSharp(NomeDaTabela, campo) + " " + tratanome.ConverteParaMinusculoERetiraUnderline(campo, RetiraS) + ", ";
                }

            }

            linha = linha.Substring(0, linha.Length - 2);
            aFile.Write(linha);
            aFile.Write(")\n");
            aFile.Write("\t        {\n");

            foreach (string campo in tabelasecampos.CamposChavesDaTabela(NomeDaTabela))
            {
                aFile.Write("\t            this." + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(campo, RetiraS) +
                       " = " + tratanome.ConverteParaMinusculoERetiraUnderline(campo, RetiraS) + ";\n");
            }

            aFile.Write("\t        }\n\n");

            linha = string.Empty;
            foreach (string campos in tabelasecampos.CamposChavesDaTabela(NomeDaTabela))
            {
                if (tabelasecampos.NomeDaTabelaDaChaveEstrgeira(NomeDaTabela, campos) != "NULL")
                {
                    linha = "\t        public virtual " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(tabelasecampos.NomeDaTabelaDaChaveEstrgeira(NomeDaTabela, campos), RetiraS) +
                        " " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(campos.ToLower(), RetiraS);
                    aFile.Write(linha);
                    if (!PropriedadesAutomaticas)
                    {
                        aFile.Write("\n");
                        aFile.Write("\t        {\n");
                        aFile.Write("\t            get{ return this." + tratanome.ConverteParaMinusculoERetiraUnderline(campos.ToLower(), RetiraS) + "; }\n");
                        aFile.Write("\t            set{ this." + tratanome.ConverteParaMinusculoERetiraUnderline(campos.ToLower(), RetiraS) + " = value; }\n");
                        aFile.Write("\t        }\n");
                        aFile.Write("\n");
                    }
                    else
                    {
                        aFile.Write(" { get; set; }\n");
                    }

                }
                else
                {

                    linha = "\t        public virtual " + tabelasecampos.TipoDadoCSharp(NomeDaTabela, campos) +
                        " " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(campos.ToLower(), RetiraS);
                    aFile.Write(linha);
                    if (!PropriedadesAutomaticas)
                    {
                        aFile.Write("\n");
                        aFile.Write("\t        {\n");
                        aFile.Write("\t            get{ return this." + tratanome.ConverteParaMinusculoERetiraUnderline(campos.ToLower(), RetiraS) + "; }\n");
                        aFile.Write("\t            set{ this." + tratanome.ConverteParaMinusculoERetiraUnderline(campos.ToLower(), RetiraS) + " = value; }\n");
                        aFile.Write("\t        }\n");
                        aFile.Write("\n");
                    }
                    else
                    {
                        aFile.Write(" { get; set; }\n");
                    }

                }

            }
            aFile.Write("\n\n");
            aFile.WriteLine("\t\t\tpublic override bool Equals(object obj)");
            aFile.WriteLine("\t\t\t{");
            aFile.WriteLine("\t\t\t    return base.Equals(obj);");
            aFile.WriteLine("\t\t\t}\n");
            aFile.WriteLine("\t\t\tpublic override int GetHashCode()");
            aFile.WriteLine("\t\t\t{");
            aFile.WriteLine("\t\t\t    return base.GetHashCode();");
            aFile.WriteLine("\t\t\t}\n");
            aFile.WriteLine("\t\t}\n");
        }
        public void GeraMetodoGetKey(string NomeDaTabela, TrataNome tratanome, ITabelasECampos tabelasecampos, StreamWriter aFile, bool RetiraS)
        {
            aFile.Write("\n");

            aFile.Write("       public " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(NomeDaTabela, RetiraS) + " Get" +
                tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(NomeDaTabela, RetiraS) + "(object id)\n");
            aFile.Write("       {\n");

            aFile.Write("           using (ISession session = NHibernateHelper.OpenSession())\n");
            aFile.Write("           {\n");

            aFile.Write("               " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(NomeDaTabela, RetiraS)
                + " toReturn =  session.Get(typeof("
                + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(NomeDaTabela, RetiraS) + "), id) as " +
                tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(NomeDaTabela, RetiraS) + ";\n");
            aFile.Write("               session.Close();\n");
            aFile.Write("               return toReturn;\n");
            aFile.Write("           }\n");

            aFile.Write("       }\n");
            aFile.Write("\n");

            aFile.Write("       public " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(NomeDaTabela, RetiraS) + " Get" +
                tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(NomeDaTabela, RetiraS) + "(object id, ISession session)\n");
            aFile.Write("       {\n");

            aFile.Write("           return  session.Get(typeof("
                + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(NomeDaTabela, RetiraS) + "), id) as " +
                  tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(NomeDaTabela, RetiraS) + ";\n");

            aFile.Write("       }\n");
            aFile.Write("\n");
        }
        private void GeraVariaveis(string NomeDaTabela, TrataNome tratanome, ITabelasECampos tabelasecampos, List<string> Listacampos, StreamWriter aFile, bool RetiraS, bool PropriedadesAutomaticas)
        {
            int count = tabelasecampos.CamposChavesDaTabela(NomeDaTabela).Count;
            if (count > 1)
            {

                GeraClassePK(NomeDaTabela, tratanome, tabelasecampos, aFile, RetiraS, PropriedadesAutomaticas);
                if (PropriedadesAutomaticas)
                    return;
                aFile.WriteLine("\t\tprivate PK pk;");
            }

            if (PropriedadesAutomaticas)
                return;
            foreach (string campos in Listacampos)
            {
                if (count == 1 || !tabelasecampos.CampoChavesDaTabela(NomeDaTabela, campos))
                {

                    string linha;
                    if (tabelasecampos.NomeDaTabelaDaChaveEstrgeira(NomeDaTabela, campos) != "NULL")
                    {

                        linha = "        private " + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(tabelasecampos.NomeDaTabelaDaChaveEstrgeira(NomeDaTabela, campos), RetiraS) +
                           " " + tratanome.ConverteParaMinusculoERetiraUnderline(campos.ToLower(), RetiraS) + ";\n";

                    }
                    else
                    {
                        linha = "        private " + tabelasecampos.TipoDadoCSharp(NomeDaTabela, campos) +
                           " " + tratanome.ConverteParaMinusculoERetiraUnderline(campos.ToLower(), RetiraS) + ";\n";
                    }
                    aFile.Write(linha);
                }
            }

            string nomedatabelapassou = string.Empty;
            int i = 0;
            foreach (string tabela in tabelasecampos.TabelasOndeARelacionamento(NomeDaTabela))
            {
                if (nomedatabelapassou == tabela)
                {
                    i += 1;
                    nomedatabelapassou = tabela;
                }
                else
                {
                    i = 0;
                    nomedatabelapassou = tabela;
                }

                if (i > 0)
                {
                    aFile.Write("        private IList<" + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(tabela, RetiraS) +
                       "> " + tratanome.ConverteParaMinusculoERetiraUnderline(tabelasecampos.CamposChavesEstrageiraDaTabela(tabela)[i], RetiraS) + "List;\n");

                }
                else
                {

                    aFile.Write("        private IList<" + tratanome.ConverteAPrimeiraLetraParaMaisculoERetiraUnderline(tabela, RetiraS) +
                               "> " + tratanome.ConverteParaMinusculoERetiraUnderline(tabela, RetiraS) + "List;\n");

                }
            }

            aFile.Write("\n");
        }