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 entidadeDefModeloAvaliacaoItem
. - Í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 entidadeItemAvaliacao
.
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
.
O resultado é mais ou menos esse:
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:
O resultado desse comando é mais uma migration criada no diretório Migrations do utilitário sincronizador.
Para aplicar essa nova migration na base de dados, executaremos o sincronizador e verificaremos que o esquema do banco de dados será 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:
- 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 interfaceIDataSeedContributor
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.
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]
emSeedAsync
garante transacionalidade à operação como um todo. - O serviço
SincronizadorBdService
é o responsável pela execução do utilitárioIDataSeeder
, 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.
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!