Utilizando o NHibernate em uma aplicação ASP.NET Core \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 12 Horas 

 06 Min 

 52 Seg 

   Tempo restante da oferta: 12 06 52 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Utilizando o NHibernate em uma aplicação ASP.NET Core  [ ASP .NET ](https://www.treinaweb.com.br/blog/categoria/asp-net) [ .NET Core ](https://www.treinaweb.com.br/blog/categoria/net-core) 

# Utilizando o NHibernate em uma aplicação ASP.NET Core

 O NHibernate é uma biblioteca madura e muito utilizada que agora fornece suporte para o .NET Core. Veja um exemplo do NHibernate no ASP.NET Core.

 [ Wladimilson M. Nascimento ](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento) 7 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/06/nhibernate-no-asp-net-core.png)  

Neste artigo falaremos sobre o NHibernate no ASP.NET Core.

Persistir informações é um requisito básico de quase todos os sistemas. Não importando o tamanho da aplicação, ela necessitará armazenar dados. Às vezes será necessário lidar com apenas um pequeno grupo de tabelas, em outros cenários será necessário trabalhar com um grande e complexo banco de dados.

Quanto mais complexo for o banco, mais robusta deve ser a camada de acesso da aplicação. Felizmente existem frameworks [ORM](https://www.treinaweb.com.br/blog/o-que-e-orm/) que auxiliam neste processo. No .NET Core, duas soluções se destacam quando se trata de lidar com uma complexa base de dados: [Entity Core](https://www.treinaweb.com.br/blog/entity-framework-core-com-mysql/) e NHibernate.

Como [já abordei o Entity Core aqui antes](https://www.treinaweb.com.br/blog/recursos-de-linha-de-comando-para-o-entity-framework-core/), hoje falarei do NHibernate.

## NHibernate

O [NHibernate](https://nhibernate.info/) é um porte para .NET do framework Hibernate do Java, que é uns dos mais antigos e respeitados ORMs. Assim como o framework que o originou, o NHibernate é um projeto open-source maduro e utilizado em uma infinidade de projetos, principalmente projetos corporativos.

Isso ocorre porque possui uma grande gama de recursos: suporte nativos a vários banco de dados, várias estratégias de geração de ID, cache de segundo nível, entre outras coisas. E por possuir muitos recursos, a sua configuração não é tão simples quando o Entity Core, mas fornece mais opções de customização.

Para conhecê-lo na prática, vamos a um exemplo de CRUD simples.

## Criando a aplicação

Neste artigo criarei uma aplicação ASP.NET Core MVC:

```dos
dotnet new mvc -n AspNetCoreNHibernate

```

Nela, adicione o pacote do NHibernate:

```dos
dotnet add package NHibernate

```

Da biblioteca Fluent NHibernate:

```dos
dotnet add package FluentNHibernate

```

E o conector do SQLite (que será o banco deste exemplo):

```dos
dotnet add package System.Data.SQLite

```

Agora podemos começar a configuração do NHibernate.

## Criando e mapeando a entidade

No NHibernate é necessário definir a entidade de domínio, uma classe POCO:

```csharp
public class Product
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual int Quantity { get; set; }
    public virtual double Price { get; set; }
}

```

É importante que todas as propriedades desta entidade sejam virtual.

Para que o NHibernate reconheça a entidade, é necessário mapeá-la. O padrão da biblioteca é um mapeamento por arquivo XML, mas graças ao [FluentNHibernate](https://github.com/FluentNHibernate/fluent-nhibernate), isso pode ser feito via código:

```csharp
public class ProductMap: ClassMapping
{
    public ProductMap()
    {
        Id(x => x.Id, x =>
        {
            x.Generator(Generators.Increment);
            x.Type(NHibernateUtil.Int64);
            x.Column("Id");
        });

        Property(b => b.Name, x =>
        {
            x.Length(520);
            x.Type(NHibernateUtil.String);
            x.NotNullable(true);
        });

        Property(b => b.Quantity, x =>
        {
            x.Type(NHibernateUtil.Int32);
            x.NotNullable(true);
        });

        Property(b => b.Price, x =>
        {
            x.Type(NHibernateUtil.Double);
            x.Scale(2);
            x.Precision(15);
            x.NotNullable(true);
        });

        Table("Products");
    }
}

```

Com a classe mapeada, podemos registrar o NHibernate nos serviços da nossa aplicação.

## Configurando o serviço do NHibernate

Seguindo o padrão do ASP.NET Core, criarei uma extensão para o nosso serviço:

```csharp
public static class NHibernateExtensions
{
    public static IServiceCollection AddNHibernate(
		this IServiceCollection services, 
		string connectionString)
    {
        var mapper = new ModelMapper();
        mapper.AddMappings(typeof(NHibernateExtensions).Assembly.ExportedTypes);
        HbmMapping entityMapping = mapper.CompileMappingForAllExplicitlyAddedEntities();

        var configuration = new Configuration();
        configuration.DataBaseIntegration(c =>
        {
            c.Dialect();
            c.ConnectionString = connectionString;
            c.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
            c.SchemaAction = SchemaAutoAction.Update;
            c.LogFormattedSql = true;
            c.LogSqlInConsole = true;
        });
        configuration.AddMapping(entityMapping);

        var sessionFactory = configuration.BuildSessionFactory();

        services.AddSingleton(sessionFactory);
        services.AddScoped(factory => sessionFactory.OpenSession());

        return services;
    }
}

```

Note que é indicado que as classes de domínio estão mapeadas em classes da aplicação. Também definimos as configurações de conexão e por fim, é criado a sessão.

[  ![C# (C Sharp) Avançado](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/csharp.svg)   Curso C# (C Sharp) Avançado Conhecer o curso ](https://www.treinaweb.com.br/curso/csharp-avancado)

Esta sessão é adicionada no escopo, para que a conexão com o banco de dados não fique sempre “aberta”. O banco será acessado por um objeto sessão e ao adicioná-la no escopo, ele só será criado quando for utilizado.

Por fim é necessário chamar o método `AddNHibernate` em `ConfigureServices` da classe `Startup`:

```csharp
public void ConfigureServices(IServiceCollection services)
{
    services.AddNHibernate(Configuration.GetConnectionString("SQLiteConnection"));
    services.AddControllersWithViews();
}

```

Com essas configurações já podemos acessar o banco de dados. Mas para este projeto criarei e implementarei o padrão *repository*.

## Criando o repositório da aplicação

O nosso repositório será composto de uma interface:

```csharp
public interface IRepository
{
    Task Add(T item);
    Task Remove(long id);
    Task Update(T item);
    Task FindByID(long id);
    IEnumerable FindAll();
}

```

E sua implementação:

```csharp
public class ProductRepository : IRepository
{
    private ISession _session;
    public ProductRepository(ISession session) => _session = session;
    public async Task Add(Product item)
    {
        ITransaction transaction = null;
        try
        {
            transaction = _session.BeginTransaction();
            await _session.SaveAsync(item);
            await transaction.CommitAsync();
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex);
            await transaction?.RollbackAsync();
        }
        finally
        {
            transaction?.Dispose();
        }
    }

    public IEnumerable FindAll() => 
					_session.Query().ToList();

    public async Task FindByID(long id) => 
					await _session.GetAsync(id);

    public async Task Remove(long id)
    {
        ITransaction transaction = null;
        try
        {
            transaction = _session.BeginTransaction();
            var item = await _session.GetAsync(id);
            await _session.DeleteAsync(item);
            await transaction.CommitAsync();
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex);
            await transaction?.RollbackAsync();
        }
        finally
        {
            transaction?.Dispose();
        }
    }

    public async Task Update(Product item)
    {
        ITransaction transaction = null;
        try
        {
            transaction = _session.BeginTransaction();
            await _session.UpdateAsync(item);
            await transaction.CommitAsync();
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex);
            await transaction?.RollbackAsync();
        }
        finally
        {
            transaction?.Dispose();
        }
    }
}

```

Note que nas operações que realizam alterações no banco, é criada uma transação:

```csharp
transaction = _session.BeginTransaction();
await _session.SaveAsync(item);
await transaction.CommitAsync();

```

Isso não é necessário, mas é recomendado que seja implementado. Assim, caso ocorra um erro durante a alteração, é possível voltar o banco para o estado anterior a transação:

```csharp
await transaction?.RollbackAsync();

```

Para finalizarmos, é necessário criar o controller.

## Criando controller da aplicação

O nosso controller será um controller CRUD padrão:

```csharp
public class ProductController : Controller
{
    private readonly ProductRepository productRepository;

    public ProductController(NHibernate.ISession session) => 
						productRepository = new ProductRepository(session);

    // GET: Products
    public ActionResult Index()
    {
        return View(productRepository.FindAll().ToList());
    }

    // GET: Products/Details/5
    public async Task Details(long? id)
    {
        if (id == null)
        {
            return StatusCode(StatusCodes.Status404NotFound);
        }
        Product product = await productRepository.FindByID(id.Value);
        if (product == null)
        {
            return StatusCode(StatusCodes.Status404NotFound);
        }
        return View(product);
    }

    // GET: Products/Create
    public ActionResult Create()
    {
        return View();
    }

    // POST: Products/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task Create(
					[Bind("Id,Name,Quantity,Price")]
					Product product)
    {
        if (ModelState.IsValid)
        {
            await productRepository.Add(product);
            return RedirectToAction("Index");
        }

        return View(product);
    }

    // GET: Products/Edit/5
    public async Task Edit(long? id)
    {
        if (id == null)
        {
            return StatusCode(StatusCodes.Status400BadRequest);
        }
        Product product = await productRepository.FindByID(id.Value);
        if (product == null)
        {
            return StatusCode(StatusCodes.Status404NotFound);
        }
        return View(product);
    }

    // POST: Products/Edit/5
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task Edit(
				[Bind("Id,Name,Quantity,Price")]
				Product product)
    {
        if (ModelState.IsValid)
        {
            await productRepository.Update(product);
            return RedirectToAction("Index");
        }
        return View(product);
    }

    // GET: Products/Delete/5
    public async Task Delete(long? id)
    {
        if (id == null)
        {
            return StatusCode(StatusCodes.Status400BadRequest);
        }
        Product product = await productRepository.FindByID(id.Value);
        if (product == null)
        {
            return StatusCode(StatusCodes.Status404NotFound);
        }
        return View(product);
    }

    // POST: Products/Delete/5
    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public async Task DeleteConfirmed(long id)
    {
        await productRepository.Remove(id);
        return RedirectToAction("Index");
    }
}

```

Antes de ver o sistema funcionando é necessário criar as views para as actions acima. Você pode vê-la [no repositório do projeto](https://github.com/wladimilson/aspnetcore-nhibernate).

Com isso, ao executá-lo, veremos que está tudo certo:

![Página index mostrando a listagem de produtos](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/06/listagem-produtos.png)

## Conclusão

O NHibernate é uma ótima solução para aplicações que precisam lidar com bancos de dados complexos ou que não sejam suportado pelo Entity Core. Com vários anos de estrada é um framework popular e estável, que pode ser utilizado em qualquer projeto sem medo.

Então quando for criar o seu projeto, não deixe de dar uma olhada neste framework.

Você pode ver o código completo do projeto no [meu Github](https://github.com/wladimilson/aspnetcore-nhibernate).

- [ #.NET Core ](https://www.treinaweb.com.br/blog/tag/net-core)
- [ #ASP .NET Core ](https://www.treinaweb.com.br/blog/tag/asp-net-core)
- [ #NHibernate ](https://www.treinaweb.com.br/blog/tag/nhibernate)

Autor

 ![Wladimilson M. Nascimento](//secure.gravatar.com/avatar/f0dd442f156a3eacd2880e9cd0eafbd1?d=mm)

## Wladimilson M. Nascimento

 Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/08/utilizando-o-micro-orm-dapper-em-uma-aplicacao-asp-net-core-400x280.jpg)  [ ASP .NET ](https://www.treinaweb.com.br/blog/categoria/asp-net) 

     9 anos atrás

    ##  [ Utilizando o Micro ORM Dapper em uma aplicação ASP.NET Core ](https://www.treinaweb.com.br/blog/utilizando-o-micro-orm-dapper-em-uma-aplicacao-asp-net-core) 

     Conheça o micro framework ORM Dapper.NET e aprenda a utilizá-lo em uma aplicação ASP.NET Core.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/08/deploy-de-uma-aplicacao-spring-boot-no-heroku-400x280.png)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     5 anos atrás

    ##  [ Deploy de uma aplicação Spring Boot no Heroku ](https://www.treinaweb.com.br/blog/deploy-de-uma-aplicacao-spring-boot-no-heroku) 

     Neste artigo veremos como podemos realizar o deploy de uma aplicação Spring Boot na nuvem com o Heroku.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/07/fluxo-de-autenticacao-baseado-em-jwt-400x280.png)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     5 anos atrás

    ##  [ Fluxo de autenticação baseado em JWT ](https://www.treinaweb.com.br/blog/fluxo-de-autenticacao-baseado-em-jwt) 

     Neste artigo iremos aprender de teórica como é o fluxo de autenticação baseado em JWT dentro de uma API REST.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/01/iniciando-com-spring-data-jpa-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     5 anos atrás

    ##  [ Iniciando com Spring Data JPA ](https://www.treinaweb.com.br/blog/iniciando-com-spring-data-jpa) 

     Neste artigo iremos conhecer o Spring Data JPA, entender o seu funcionamento e como o mesmo pode nos auxiliar na camada de persistência.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/01/criando-uma-api-com-spring-data-jpa-e-spring-web-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     5 anos atrás

    ##  [ Criando uma API com Spring Data JPA e Spring Web ](https://www.treinaweb.com.br/blog/criando-uma-api-com-spring-data-jpa-e-spring-web) 

     Neste artigo vamos aprender como criar uma API com persistência de dados utilizando o Spring Web MVC e o Spring Data JPA.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/07/05112250/SPRING-BOOT-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     7 anos atrás

    ##  [ Criando uma API REST com o Spring Boot ](https://www.treinaweb.com.br/blog/criando-uma-api-rest-com-o-spring-boot) 

     Todos os passos da criação de uma API REST com o framework Spring Boot do Java, no Visual Studio Code.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/projeto-lombok-acelerando-o-desenvolvimento-java-400x280.png)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     6 anos atrás

    ##  [ Projeto Lombok - Acelerando o desenvolvimento Java ](https://www.treinaweb.com.br/blog/projeto-lombok-acelerando-o-desenvolvimento-java) 

     Veja como podemos utilizar o projeto Lombok para diminuir a quantidade de código boilerplate e acelerar o desenvolvimento de projetos Java.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/09/25004250/5-motivos-estudar-java-400x280.png)  [ Carreira ](https://www.treinaweb.com.br/blog/categoria/carreira) 

     7 anos atrás

    ##  [ 5 motivos para estudar Java ](https://www.treinaweb.com.br/blog/5-motivos-para-estudar-java) 

     Confira neste artigo cinco motivos para você colocar o Java em seu plano de estudos.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/11/03082200/ORM-CAPA-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ O que é ORM? ](https://www.treinaweb.com.br/blog/o-que-e-orm) 

     Nesse artigo aprenderemos o que é ORM, quais problemas ele resolve, os padrões mais usados e quais os principais ORMs do mercado.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/10/03234313/kotlin-400x280.jpg)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     7 anos atrás

    ##  [ É possível usar Kotlin no back-end? ](https://www.treinaweb.com.br/blog/e-possivel-usar-kotlin-no-back-end) 

     Confira neste artigo o Kotlin, a linguagem de programação da JetBrains e da Google que é considerada a segunda linguagem mais amada e vêm ganhando mais mercado a cada ano.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/08/EJS-400x280.png)  [ Node ](https://www.treinaweb.com.br/blog/categoria/node-js) 

     5 anos atrás

    ##  [ Utilizando template engine EJS com Node.js ](https://www.treinaweb.com.br/blog/utilizando-template-engine-ejs-com-node-js) 

     Neste artigo vamos aprender a utilizar a Template Engine EJS com Node.js e também alguns recursos interessantes desta ferramenta.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/04/utilizando-arquivos-dotenv-env-em-uma-aplicacao-asp-net-core-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     6 anos atrás

    ##  [ Utilizando arquivos Dotenv (.env) em uma aplicação ASP.NET Core ](https://www.treinaweb.com.br/blog/utilizando-arquivos-dotenv-env-em-uma-aplicacao-asp-net-core) 

     O uso de arquivos .env é quase o padrão de aplicações web, veja como utilizá-los em uma aplicação ASP.NET Core.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **12h 06min 52s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
