A versão Core 5 RC 1 veio com tantas novidades, entre muitas delas o relacionamento que já existe a muito tempo na versão 6 que é o muitos para muitos (N:M), e também serão citados outros recursos:

Muitos para muitos

Temos duas formas de configurar esse tipo de relação:

1 — Implícita:

Significa que ao configurar duas coleções entre duas entidades automaticamente é criado a relação com uma tabela intermediária, exemplo:

Author:

Book:

somente com essa configuração já tem o relacionamento esperado muitos para muitos em precisar configurar nenhum tipo de entidade explicitamente.

2 — Explicita

Agora existe uma forma de criar um entidade intermediária e configurar essa explicitamente para que tenha de certa forma controles em nomes e maneiras de utilizar essa relação com tabela intermediária, exemplo:

Seguindo as duas entidades do item 1. Implicita crie mais um entidade com o seguinte layout:

e a partir dessa nova entidade que vai simbolizar a tabela intermediária também precisa explicitar a configuração:

e nesse aspecto pode também ser configurado outros campos nessa tabela intermediária, acredito que a forma 2 é em relação a adição de mais campos nessa tabela intermediária, se não for adicionar mais campos o exemplo 1 é para mim o mais recomendável.

Um novo jeito de mapear?

Foi mencionado na referencia desse artigo que pode criar entidades diferentes com o mesmo tipo CLR(Common Language Runtime). É para mim um grande novidade, mas, basicamente no exemplo mencionado é o uso do dicionário de dados, aquele que tem chave e valor. (Dictionary<,>). Vamos para o exemplo que demonstra com esse recurso é fácil de ser implementado:

Crie um DbSet<> com a seguinte nomenclatura:

e para configurar esse tipo de entidade utilize método SharedTypeEntity é feito da seguinte maneira:

basicamente esse tipo vai significar no seu banco de dados, uma tabela com o nome de Items onde possui 3 campos Id do tipo inteiro auto incremento, Title do tipo texto, obrigatório e com no máximo 100 caracteres e por fim um Status, obrigatório com o valor padrão como False.

Também pode ser criados relações entre essas entidades diferentes vamos assim dizer que não limita a utilizar nesse sentido.

Como salvar um registro:

Como fazer filtros:

ou seja, pelo que pude perceber precisamos trabalhar com cast para que as funções de traduções para SQL sejam feitas corretamente, porque o dicionário o valor é um objeto. Feita a execução no SQL Server e monitorando pelo SQL Server Profile que é uma boa dica para verificar se a tradução está correta e sim está tudo certo.

A demais operações segue o mesmo padrão como nas entidades com tipo definidos (class).

Eventos

Com esse novo recurso pode ser interceptado os eventos da camada, exemplo, agora é possível manipular entidades antes de ser realmente salvas ou atualizadas e também pode ser executados depois dessas ações ou ainda capturar erros.

Um exemplo legal para apresentar esse recurso é criar propriedades a serem alteradas nesses eventos, por exemplo quando cria um registro na tabela podemos saber a data e hora da gravação de criação desse registro e também todas as ultimas atualizações em determinado campo, tipo um controle Criado em e Atualizado em.

Primeiramente crie uma interface para representar esses duas implementações de campo:

então todas as classes que implementam essa interface terá um recurso exclusivo no momento da criação e também no momento da atualização. Com um classe chamada Animal é implementado os dois campos, exemplo:

Com essa classe Animal os dois campos CreatedAt e UpdatedAt serão atualizados em um determinado eventos. A partir disso vamos criar um Interceptor com a implementação da classe SaveChangesInterceptor:

esse código faz uma pesquisa em entidades com dois status Adicionados e Alterados e também se essa entidade implementou a interface IModified, e esse resultado altera as duas propriedades conforme a lógica que antes de gravar tem um processo a ser feito passando o valor de data e hora para as propriedades e assim por fim é salvo os dados todos atualizados.

Dentre os eventos permitidos são:

e no caso são 3 grupos que significa

  • Falhou ( SaveChangeFailed)

Visões ( View ) e dados formatados

A utilização de visões ou View foram alterados, melhoradas e simplificadas para essa nova versão, vamos supor que na criação de uma View é retornado 2 campos:

e no banco é criado um View com o nome de View_Animal:

e por fim configurar da seguinte forma:

Além desses recursos, tem melhorias em desempenho e simplificação no desenvolvimento com esse ORM.

Referencias

Bacharel em Sistemas de Informação, MTAC (Multi-Plataform Technical Audience Contributor-Microsoft), BackEnd C# e PHP e Developer Web

Bacharel em Sistemas de Informação, MTAC (Multi-Plataform Technical Audience Contributor-Microsoft), BackEnd C# e PHP e Developer Web