Olá pessoal,

dando mais um passo na elaboração da aplicação ASP.NET Core MVC que iniciamos no post anterior, vamos adicionar a camada de persistência utilizando o EntityFramework e um banco de dados SQLite.

Incluindo as dependências

Em primeiro lugar, precisamos alterar o arquivo project.json, incluindo a referência ao EntityFramework e ao ferramental (tooling) necessário para gerenciarmos o banco de dados.

Aspnetcore

O que foi incluído como dependência:

  • Microsoft.EntityFrameworkCore.Sqlite: Provedor do SQLite para o EntityFramework.
  • Microsoft.EntityFrameworkCore.Design: Componentes necessários para o ferramental do EF (deve estar na mesma versão do ferramental).

O que foi incluído como ferramental:

  • Microsoft.EntityFrameworkCore.Tools: Ferramental do EF.

Importante lembrar que sempre que atualizarmos as dependências ou ferramental, devemos executar o comando dotnet restore .

Criando o nosso modelo

Feito isto, o próximo passo é criar um modelo bem simples, com apenas ordens:

Captura de tela de 2016-07-24 09-02-27

E os itens destas ordens:

Captura de tela de 2016-07-24 09-04-03

É necessário também criarmos o nosso DbContext:

Captura de tela de 2016-07-24 09-05-31

Configurando o provedor do SQLite

Outra pequena alteração, é a definição do ContentRoot do nosso WebHost na classe Program.cs. Isto irá facilitar quando necessitarmos acessar arquivos de forma relativa dentro da aplicação:

Captura de tela de 2016-07-24 09-07-56

Para configurar o nosso provedor de banco de dados, vamos incluir mais um arquivo de configuração chamado appsettings.json. Neste momento vamos adicionar apenas a string de conexão:

Captura de tela de 2016-07-24 09-14-05

E em seguida, devemos carregar este arquivo de configuração na inicialização da aplicação (inclui também as variáveis de ambiente, mas para este exemplo não é necessário):

Captura de tela de 2016-07-24 09-19-05

Note que no construtor da classe, criamos a configuração utilizando o env.ContentRootPath (iniciado na classe Program.cs) como diretório base da configuração. Em ConfigureServices, utilizamos o método GetConnectionString passando apenas o nome da conexão que criamos, pois ele irá pesquisar automaticamente na sessão ConnectionStrings do arquivo appsettings.json.

Por último, adicionamos o DbContext na coleção de serviços, configurando para utilizar o SQLite.

Operações sobre as Ordens na API

Para testarmos o nosso DbContext, criaremos um novo controller chamado OrdersController:

Captura de tela de 2016-07-24 09-45-42

Como incluímos o nosso DbContext na coleção de serviços da aplicação, agora podemos obtê-lo por injeção de dependência no construtor da nossa classe.

Nele teremos três operações:

  • Get: Operação para obter uma lista de ordens, tendo a quantidade de itens retornados de forma controlada;
  • GetById: Operação para obter os detalhes de uma ordem específica, e os itens são carregados também. Importante salientar que aqui utilizei uma constraint no template da requisição para permitir somente Guids ( {id:Guid} );
  • Post: Operação para adicionar uma nova ordem.

Iniciando o banco de dados

Agora precisamos ajustar o nosso banco de dados, e para isto devemos utilizar o ferramental do EF.

Para acessar o ferramental do ef, devemos executar o comando:

dotnet ef

Nele temos as opções:

  • database: Utilizado para atualizar ou exclui o banco de dados;
  • dbcontext: Utilizado para listar ou gerar um dbcontext a partir de um banco de dados;
  • migrations: Utilizado para gerar, listar, remover ou gerar os scripts sql.

O que precisamos fazer neste momento é gerar os nossos migrations (migrações) para gerar o nosso banco de dados. Para isto, executamos o comando:

dotnet ef migrations add

Esta operação irá gerar uma pasta migrations no projeto, com as classes necessárias para gerar o nosso banco de dados.

Dockerfile

Por último, precisamos gerar o nosso banco de dados quando a imagem do docker for compilada.

Para isto, devemos incluir o comando:

RUN dotnet ef database update

no nosso Dockerfile para criar o banco do SQLite, aplicando todas as migrações criadas.

Captura de tela de 2016-07-24 10-15-04

Por fim…

Agora devemos compilar a nossa imagem com o comando:

docker build -t aspnetcore-image .

e iniciar o container com o comando:

docker run -it --name aspnetcore-container -p 8080:5000 aspnetcore-image

É importante salientar que este banco estará dentro do container, então se ele for destruído, o banco também o será.

O exemplo está no GitHub. A versão anterior está no branch aspnetcore_docker_v1.

 

 

Era isso pessoal!

Um grande abraço a todos, e boa semana!