Trabalhando com Tipos Complexos no EF Core

O Entity Framework Core apesar de funcional ainda não está 100%. Algumas funcionalidades requerem workarounds ou simplesmente não existem. Mas temos algo para comemorar, agora podemos trabalhar com tipos complexos sem impactar na modelagem de nossas entidades.

Entity Framework Core

Trabalhando com Tipos Complexos no EF Core

Eu trabalho muito com entidades ricas que seguem as boas práticas de modelagem do DDD. Para possuirmos um domínio rico é necessário dar a maior expressividade possível ao nosso código muitas vezes deixando de usar tipos primitivos para usar tipos complexos.

O Entity Framework Core antes da versão 2 simplesmente não conseguia mapear tipos complexos, ou seja, era necessário impactar diretamente na modelagem de nossas entidades apenas para contornar uma deficiência do ORM. Que coisa horrível não?

Inclusive muitos desenvolvedores simplesmente abriram mão de usar o EF Core e adotaram outras soluções como o Dapper por exemplo. Mas agora esse problema não existe mais!

Mapeando um Tipo Complexo

Vamos supor que sua entidade Cliente possui um campo CPF, muitas vezes basta criar um tipo string e pronto, mas o ideal seria que o CPF fosse um Value Object, pois permite reusabilidade de código além de permitir que a própria classe CPF cuide da questão da validação. Além disso podem existir outros dados como Data de Emissão por exemplo:

Os tipos complexos podem ser Value Objects ou outras entidades, o importante é que o modelo seja o mais rico e expressivo possível.

No EF Core 2 agora é possível utilizar Fluent API de forma nativa (sem gambiarras) e mapear os tipos complexos a partir do recurso OwnsOne:

Depois de todo trabalho de modelagem feito basta executar os comandos:

  • Add-Migration
  • Update-Database

E pronto! Seu modelo está criado.

Mapeamento Gerado no Entity Framework Core

Inserindo e recuperando a entidade através do EF Core

Uma vez que estamos trabalhando com modelos ricos, devemos seguir as boas práticas (utilizar private setters, ad-hoc setters, construtores e validação de consistência):

  • É necessário criar um construtor protected nas classes para que o EF Core possa recuperar do banco e criar a instância, pois ele não entende o construtor.
  • As validações foram feitas na mão e lançando exceptions para fins de demonstração
  • O objeto é recuperado exatamente como se deseja do banco

Entidade recuperada no Entity Framework Core

Testes

Testar é importante certo? Esse projeto foi disponibilizado com o código fonte completo inclusive testando todas as situações previstas:

Testes de Unidade no Entity Framework Core

Com este código fonte eu espero ajudar você a não ter mais nenhum problema de mapeamento de tipos complexos do seu domínio rico com Entity Framework Core.

Resumindo

O projeto completo está no meu GitHub

O EF Core ainda apresenta problemas irritantes como não possuir mapeamento Many to Many. É necessário fazer uma gambiarra horrível (mas funciona).

Não deixe de utilizar modelos ricos em suas aplicações, é muito importante para um bom design de código e uma modelagem correta de seu domínio. Agora o EF Core não será mais um problema.


Caso esteja interessado em conhecer mais sobre Testes, TDD, ASP.NET, DDD, Padrões de Arquitetura e boas práticas de desenvolvimento não deixe de conferir as ementas dos meus cursos:

Vamos continuar a troca de experiências, deixe seu comentário abaixo. Se gostou e concorda com o artigo, compartilhe com seus colegas para transmitirmos o conhecimento para o máximo de pessoas possíveis.

2017 – Um ano muito especial!

O ano de 2017 foi muito especial, um ano de consolidação, preparação e conhecimento para as futuras conquistas.

Primeiramente agradeço a você leitor deste site! Suas visitas, feedbacks e interações tem sido a minha maior motivação para continuar escrevendo e entregando conteúdos para a comunidade técnica.

É muito satisfatório saber que por dia cerca de 3.000 pessoas acessam este site e que de alguma forma estou ajudando estes em suas carreiras, resolução de problemas e etc.

Vamos aos melhores momentos de 2017:

Microsoft MVP Award

Microsoft MVP 2017 - 2018

O programa MVP está passando por diversas mudanças. Está mais aberto, agora todo mês são selecionados novos premiados e está significantemente mais simples/fácil receber essa premiação da Microsoft. Independente do mês todos renovam em Julho, como eu era do ciclo de Janeiro eu renovei para 2017 e 2018 de uma só vez!

DevXperience

DevXperience 2017

O DevXperience é a revolução do ASP.NET Brasil Conference. Nesse ano de estréia tivemos um evento para 700 pessoas com 3 trilhas e 42 palestras. Foi um sucesso! Por ser um evento novo e mais amplo eu fiquei feliz com o resultado.

Cursos de Desenvolvimento Web e Arquitetura

Esses são os números de 2017:

  • Cursos Realizados: 19
  • Alunos: 974
  • Horas ministrando curso: 1.140

Saiba mais sobre meus cursos

Site / Blog

Onde tudo começou, ter um site foi a minha primeira iniciativa de compartilhar meus conteúdos na comunidade técnica. Os resultados tem me surpreendido muito, recebo feedbacks fantásticos, eu mal consigo responder todos em tempo. O site aumentou em 37% o número de visitantes em relação ao ano passado.

Alguns números sobre o site:

  • Acessos: 1.527.180 mais de um milhão e meio de visitas em 2017 \o/
  • Média diária: 3.100
  • Posts: 137
  • Horas de vídeo: 36
  • Comentários: 3.544

O que dizer sobre esse resultado? São tantas coisas, fico muito satisfeito e gostaria de dizer MUITO obrigado a todos que fizeram parte destes números.

Conquistas pessoais

Em 2017 eu foquei um pouco mais em mim, cuidei da saúde, visual, comecei a comer melhor, praticar exercícios e etc. Foi um passo inicial, agora em 2018 além de manter eu pretendo melhorar ainda mais.

Minha visão de 2017

O ano de 2017 no geral foi um ano de transição, tivemos uma pequena melhora na economia e no cenário nacional, mas ainda tem muito chão para chegar próximo do aceitável.

O meu ano de 2017 também foi de transição, observei vários aspectos de minhas atuações no mercado e planejei mudanças que irei colocar em prática em 2018. Foi um ótimo ano, bati todas minhas metas e me preparei para colocar muita coisa em prática neste novo ano.

O que vem pela frente?

Parte das mudanças que planejei no aspecto profissional é na minha atuação com a comunidade técnica.

Percebi que com o crescimento da demanda pelos meus treinamentos e consultoria eu acabei me afastando um pouco da comunidade e contribuí com menos do que queria.

Por isso deixo aqui um compromisso público de entregar mais conteúdos (gratuitos):

  • Entregar 10 palestras em eventos
  • Escrever no 20 posts neste blog
  • Realizar 5 Meetups presenciais
  • Gravar 5 vídeos para meu canal no Eduardo Pires
  • Retornar com o canal Sou Desenvolvedor
  • Entregar a versão 2.0 do Equinox Project

Esses números são o mínimo, sendo que pode vir a ser muito mais 🙂

2017 foi um ano inesquecível. Muito obrigado por fazer parte dele.

Desejo a você um excelente 2018! Muito sucesso, estudos, foco e dedicação!
Grande Abraço.