Pular para conteúdo

Persistência dos dados em Banco de Dados

Verificamos na seção Implementação das funcionalidades que o backend já tem uma estrutura de objetos e codificação suficiente para satisfazer as funcionalidades de criação, preenchimento e finalização de listas de checagem.

Agora é hora de gravar os registros em banco de dados. A seguir, quais os tipos de registros que serão gravados:

  • Definição de índices: Template gerador de um Índice. Representado pela entidade DefModeloIndiceAvaliacao.
  • Definição de Avaliação: Template gerador de cada avaliação. Representado pela agregação DefModeloAvaliacao e pela entidade DefModeloAvaliacaoItem.
  • Índices: Representado pela entidade IndiceAvaliacao.
  • Avaliações efetivas: Avaliações preenchidas pelos utilizadores. Gerado com base em uma "Definição de Avaliação". Representado pela agregação AvaliacaoEfetiva e pela entidade ItemAvaliacao.

Configurando a persistência

Esta aplicação foi criada para utilizar o Entity Framework ⧉ como ORM para mapeamento entre os atributos de uma entidade e a sua representação em banco de dados.

O percurso para fazer a persistência será portanto:

  • Construir o mapeamento das entidades e agregações que serão persistidas.
  • Criar mais uma migração para atualizar o esquema de tabelas na base de dados já criada na Inicialização.
  • Executar a nova migração, via sincronizador.
  • Incluir, via sincronizador, registros de inicialização nas tabelas mapeadas para as entidades DefModeloIndiceAvaliacao, DefModeloAvaliacao.
  • Substituir o dataservices in-memory utilizado na primeira versão.
  • Verificar o funcionamento novamente.

Mapeamento das entidades

No projeto Magna.IndicePmo.EntityFrameworkCore, utilizamos a classe IndicePmoDbContextModelCreatingExtensions para definir um extension method de configuração, que será chamado através da rotina IndicePmoDbContext.OnModelCreating.

DbContext OnModelCreating

O resultado é mais ou menos esse:

Mapeamento de entidades no DbContext

Mapeamento e configuração de entidades

As técnicas para configurar mapeamentos variam bastante. Algumas referências importantes para esta POC são os sites: Learn Entity Framework Core ⧉ e Entity Framework Tutorial ⧉.

Migration e DataSeeding

O mapeamento construído em IndicePmoDbContextModelCreatingExtensions é diretamente utilizado pelo DbContext IndicePmoMigratorDbContext utilizado em Magna.IndicePmo.SincronizadorBd. O próximo passo é criar uma nova migração. Isso é feito da seguinte forma:

Novamente, a partir do terminal de comando aberto a partir do diretório raiz da solução:

 cd host\Magna.IndicePmo.SincronizadorBd
  dotnet ef migrations Add Inclusao_Modelo_Avaliacoes

O resultado desse comando é mais uma migration criada no diretório Migrations do utilitário sincronizador. Nova migration criada

Para aplicar essa nova migration na base de dados, executaremos o sincronizador e verificaremos que o esquema do banco de dados será atualizado.

Esquema de Dados atualizado

Prefixos nas tabelas

Note que as tabelas próprias do framework ABP e as tabelas das entidades e agregações da POC estão com prefixos diferentes. Essa é uma comodidade oferecida pelo Entity Framework. Os prefixos podem ajudar a diferenciar rapidamente o papel de uma ou mais tabelas num mesmo esquema de dados.

Para finalizar as tarefas do Sincronizador, incluiremos um script de preenchimento dos templates de avaliações que temos disponíveis. Isso é realizado da seguinte forma:

Dataseeding usando sincronizador

  • 1 modelos-inicializacao.json: Um arquivo contendo as definições de índices e modelos de avaliação.
  • 2 DefModelosDataSeedContributor: Um contribuidor de preenchimento. Basicamente uma implementação da interface IDataSeedContributor que será executado durante a execução do Sincronizador.

Definimos em DefModelosDataSeedContributor rotinas para deserializar índices de definições de avaliações e gravá-los no banco de dados, caso ainda não existam.

Contribuidores *dataseeding*

Explicando:

  • A rotina SeedAsync contém as importações que desejamos fazer.
  • A rotina PreencherDefIndicesAsync ilustra o roteiro de deserialização, verificação se os registros já existem e a posterior gravação.
  • Repare que o atributo [UnitOfWork] em SeedAsync garante transacionalidade à operação como um todo.
  • O serviço SincronizadorBdService é o responsável pela execução do utilitário IDataSeeder, que por sua vez, recruta todos os contribuidores disponíveis.

Uma vez executado o migrador, o banco de dados será preenchido com os dados de inicialização.

alt text

DataServices com Entity Framework

A implementação IAvaliacoesDataService baseada em memória, InMemoryAvaliacoesDataService, utilizada na etapa de Implementação das funcionalidades será substituída por uma implementação que utilize o banco de dados.

A classe implementadora de IAvaliacoesDataService é EfAvaliacoesDataService, também localizada no projeto Magna.IndicePmo.EntityFrameworkCore, uma vez que utiliza diretamente os artefatos do entity framework.

Esta implementação se encarrega de coordenar operações entre um ou mais repositórios de entidades, tornando transparente para o restante da aplicação detalhes das operações de leitura, escrita e remoção de registros no banco de dados.

Agora, as operações de gravação realizadas pela API podem ser guardadas e consultadas posteriormente!