Primeiras aulas do curso .NET 5 e EF Core: relacionando entidades

.NET 5 e EF Core: relacionando entidades

Incrementando o projeto - Apresentação

E aí pessoal, tudo bem? Eu sou o Daniel e serei o seu instrutor nesse curso. O que nós vamos ver nele, pessoal? Nesse curso nós vamos seguir do anterior que nós terminamos nos nossos verbos, nas operações essenciais com HTTP, que eu recomendo que você tenha feito, que faz parte da nossa formação essa C Sharp.

A partir desse projeto terminado que nós já vimos e temos o projeto inicial também para quem estiver começando agora, nós vamos ver como tornar o nosso sistema mais robusto. Então da parte que nós criamos, lemos, atualizamos e removemos um filme, o que nós podemos partir? Como é que nós podemos tornar nosso sistema mais complexo que só tinha um filme e vai passar a ter um cinema, um endereço, um gerente, uma sessão.

Então a ideia desse curso é mostrar como nós vamos relacionar essas diferentes entidades a partir de agora, já que nós conseguimos criar elas sem muitos problemas e, a proposta agora é como nós vamos criar um relacionamento de um para um, de um para muitos, de muitos para muitos e como é que nós vamos também conseguir utilizar em aquele automapper, lembra que nós vimos no final do curso anterior, para nos ajudar a fazer essas operações em alguns casos.

Nesse curso nós vamos chegar até a parte de realizar algumas consultas para validar se tudo que nós fizemos foi coerente e está certo, e eu te convido a assistir a nossa primeira aula que vem logo agora. Eu te vejo lá e até mais!

Incrementando o projeto - Adicionando o Endereço

Então vamos lá, pessoal. Nesse vídeo nós vamos dar o pontapé inicial no nosso projeto, utilizando o projeto do curso anterior como base. Então isso significa que é altamente recomendável que você já tenha feito o curso anterior de pré-requisito a esse, para que você consiga não só entender o projeto que vai ser utilizado, mas também os conceitos que nós vamos abordar nesse curso. Nós não vamos focar tanto em alguns porque ele já foram explicados no curso anterior.

Então a própria parte da instalação do Visual Studio foi foco do curso anterior, a definição do banco de dados, conectar uma API com o banco já foi explicado e nós não vamos focar nessa parte, o foco desse curso vai ser no relacionamento.

Então mais uma vez, para nós voltarmos, eu vou utilizar o projeto do curso anterior, como eu já falei, e com o Visual Studio aberto eu já vou “Abrir um projeto ou uma solução” e na minha pasta “Projeto Inicial” eu vou abrir nosso "FilmesApi.sln" que é uma pequena modificação de como o nosso projeto curso anterior foi finalizado. Eu vou disponibilizar para vocês baixarem o projeto inicial desse curso.

Então vou clicar duas vezes para abrir e dentro dele nós vamos ver algumas, essas pequenas modificações e vamos entendê-las. Deixa eu fechar esse aviso na tela inicial e nós temos a mesma estrutura, então no canto direito a pasta "Properties", “Controllers”, “Data”, “Migrations” que está vazia, “Models” e “Profiles”. E vamos olhar, de início, a nossa pasta “Models” para nós vermos o que está acontecendo.

Nós temos o nosso “Cinema.cs” e temos o “Filme.cs” e, a ideia é o que? Nós já tínhamos a nossa classe “Filme”, o nosso modelo e agora nós temos a nossa classe, o nosso modelo de “Cinema”. Onde nós vamos tornar o nosso sistema mais complexo, nós sabemos que filmes são exibidos em cinemas, hoje em dia também em plataformas de stream, mas nós queremos fazer essa junção com os cinemas.

E o cinema tem a nossa chave que é o nosso ID, que é Required, e o cinema pode ter um nome, como, por exemplo, “Alura Cinemas”, o nome que nós quisermos dar para o nosso cinema. Se nós formos olhar na nossa pasta “Data”, nós também já vamos ter os nossos "Dtos" que nós definimos no nosso “AppDbContext”, a mesma ideia onde nós definimos o nosso DB7 para acessar o nosso cinema através dos cinemas.

Só que agora se nós formos olhar em “Controllers”, nós já temos o nosso “Cinema”, o nosso “Filme”, sendo que o cinema segue a mesma ideia de fazer as operações básicas de criar, ler, atualizar e remover um recurso do nosso sistema. E nós temos também um “EnderecoController” onde nós já temos essas operações só que se nós formos olhar de maneira mais crítica, nós podemos ver que nós ainda não definimos a nossa classe Endereco, o nosso modelo, nem o nosso DB7.

Então nós vamos aproveitar um pouco desse vídeo para dar uma refrescada nessa criação do nosso modelo, a parte de controlador não vai ser mais o nosso foco, então nós vamos ver como nós vamos criar o nosso modelo para cadastrar e inserir ele no banco. O nosso DB7 e, também relembrar um pouco sobre o automapper, que vai ser responsável pela conversão entre os nossos DTOs e modelos, e vice-versa.

Então nós já temos também na nossa pasta “Dtos” criado o nosso “Cinema” com as suas “Create”, “Read” e “Update” respectivamente, e do nosso "Endereço" também. Então para o nosso “Endereço”, de início, nós queremos o que? Nós queremos criar essa classe Endereco porquê se eu quero ir ao cinema em algum momento, eu preciso saber qual é o endereço desse cinema. Então eu preciso ter essa informação cadastrada de alguma maneira.

E para que eu tenha essa informação cadastrada, além da parte que já veio criada, que não vai ser nosso foco, que é o nosso controlador e o nosso “Dto”, nós precisamos também do nosso modelo. Então vamos na nossa pasta "Models" e vamos criar, eu estou clicando com o botão direito “Adicionar > Classe”, e vou colocar o nome dela que vai ser “Endereco”.

A classe que vai ser criada é vazia, e nós precisamos começar a mapear e falar como essa classe vai ser gerada e mapeada no nosso banco de dados. Então o que nós precisamos? Nós já vimos que se nós queremos criar um recurso no banco, nós precisamos ter uma maneira única de identificar ele, então nós precisamos utilizar a nossa [Key], a nossa notação key, e também vamos falar que ela é obrigatória, porque nós precisamos ter uma maneira de identificar um recurso no banco.

Na linha 12, vou escrever aqui pro, para nós utilizarmos o nosso atalho, vou apertar “Tab, Tab”, e nós vamos colocar int, “Tab” mais uma vez, Id {get; set; }. Agora eu preciso de que? O nosso endereço tem mais quais informações? Bom, no mundo real nós podemos ter diversas, mas as que nós vamos utilizar são: Logradouro, então vou colocar na linha 13 prop, então nós vamos ter uma string Logradouro, então pode ser que seja uma rua qualquer, uma avenida qualquer.

Nós vamos ter também um bairro, então prop, “Tab”, “Tab”, eu vou colocar string Bairro. Nós vamos ter um número, então prop mais uma vez, só que dessa vez int Numero. Então nós vamos ter um endereço qualquer que vai ser em alguma rua, alguma avenida, em algum determinado número. E por enquanto vai ser só.

Para nós contornarmos esse erro da linha 11 nós já sabemos, nós clicamos dele, “Cttrl + ponto”, e ele vai aparecer na tela, nós teremos que utilizar as “DataAnnotations” para o nosso modelo, beleza?

Se nós olharmos no nosso controlador, o nosso "EnderecoController", ele ainda vai estar reclamando porque nós precisamos vir na linha 29, clicar com o botão em cima mais uma vez, o botão esquerdo do mouse e fazer o import, nós queremos utilizar o "FilmesApi.Models” aqui dentro. E agora nós precisamos apenas focar nessa parte do contexto.

Então como nós podemos falar para o nosso context, o nosso “AppDbContext”, que ele vai ter uma maneira de acessar essas informações de um endereço no banco? Basta nós virmos em “AppDbContext”, nós já temos na definição do nosso DbSet de filmes <Cinema> também e nós vamos definir na linha 15 o nosso public DbSet <Endereco> e vamos chamar de Enderecos { get; set; }.

Mais uma vez nós precisamos dar “Ctrl + ponto”, importar a classe Endereco e no nosso “EnderecoController” ele também tem o import do contexto e ele parou de reclamar, a princípio está tudo ok. E qual é o ponto que nós precisamos para finalizar esse vídeo e relembrar bem o conteúdo que nós vamos utilizar aqui? O que nós precisamos fazer?

Bom, se nós vamos adicionar o endereço em algum momento, nós precisamos receber um Dto e o nosso automapper faz a conversão desse Dto para um endereço qualquer. Então dentro da nossa classe, dentro da nossa pasta “Profiles”, nós temos o nosso “CinemaProfile” e o nosso “FilmeProfile”, eu vou clicar com o botão direito na pasta “Profiles”, vou adicionar uma classe nova que eu vou chamar de “EnderecoProfile”.

E o que é que nós vamos ter dentro dessa classe? Nós precisamos informar ao automapper, através desse “Profile”, como ele vai mapear um Dto de um endereço, para um endereço mesmo. Então nós precisamos estender a classe Profile e vamos criar na linha 10 um construtor para ela. E dentro do construtor dela nós vamos utilizar o nosso CreateMap e falar que nós queremos converter, por exemplo, de um <CreateEnderecoDto, Endereco>. Então nós vamos falar que nós queremos ter uma maneira de converter de um CreateEnderecoDto para um Endereco.

O que mais nós vamos querer fazer também? Vamos querer converter também de um CreateMap<Endereco, ReadEnderecoDto>. E, por fim, nós querermos também fazer um CreateMap<UpdateEnderecoDto, Endereco> qualquer. Então vou colocar na linha na linha 4.

E por fim nós vamos nós precisamos fazer nas importações, então na linha 8 botão esquerdo clique em "Profile > Using AutoMapper > Ctrl + ponto”, vou dar um “Enter”. E agora nós precisamos importar também os nossos Dtos, a mesma ideia. Cliquei, “Ctrl + ponto”, e o endereço também cliquei, “Ctrl + ponto”, queremos usar os “Models”.

Então nós já tínhamos o controlador e também os nossos Dtos, e agora nós criamos, fazendo essa pequena revisão do nosso “Cinema”, a partir do nosso “CinemaProfile” e do nosso “FilmeProfile”, nós criamos também o nosso “EnderecoProfile” fazendo esse pequeno apanhado do que nós vamos utilizar durante esse curso e focando, principalmente, na parte de modelo e de mapeamento entre um Dto e um modelo efetivo do nosso sistema.

Então por esse vídeo nós finalizamos, nós criamos um recurso que é o harness, fizemos essa pequena revisão. Caso você não tenha entendido muito e não tenha feito já o pré-requisito, mais uma vez, é muito importante que você faça. E caso você ainda tenha alguma dúvida, por favor, vá lá no fórum, caso você já tenha feito o curso. E caso também queira, tenha algum questionamento, por favor, também deixe lá no fórum para que nós consigamos seguir a partir daqui sem nenhum problema.

Por esse vídeo é só, nós tornamos o nosso sistema um pouco mais complexo, nós adicionamos essas entidades de endereço. E no próximo vídeo nós vamos entender qual é a proposta do nosso sistema completo, o que nós ainda vamos ter problema a partir de agora. Eu vejo vocês no próximo vídeo e até mais!

Incrementando o projeto - Apresentando o problema

Pessoal, então o que nós fizemos no vídeo anterior? Nós criamos a nossa classe de endereço, nós podemos ver a nossa representação na figura que está na tela, só que o que acontece, como o nosso sistema está atualmente? Quando nós criamos, por exemplo, algum filme, algum cinema ou algum endereço, nós preenchemos as informações através do Postman que nós vamos utilizar daqui para frente, nós definimos essas informações e nós enviamos para o nosso banco.

Então de alguma maneira, nós já sabemos como essas informações são armazenadas, utilizando o Entity Framework, mas o que acontece, vamos ver o caso, por exemplo, do nosso cinema. Quando eu quero cadastrar um cinema nós definimos um nome para ele a princípio e nós vamos colocar ele dentro da nossa base.

Então a pergunta que nós queremos fazer, que nós nos propusemos a fazer no vídeo anterior é: Qual é o endereço desse cinema? Como é que eu coloco essa classe de endereço, esse modelo para representar efetivamente o endereço de um cinema? Já que ele só tem esse campo de nome até então.

Bom, nós precisamos ter alguma maneira de fazer isso, já que quando nós inserimos esses dados, eles não estão relacionados. Então no momento em que, dando um zoom na parte apenas do cinema e do endereço, vamos deixar o filme de lado, eu preencho a informação de nome do meu cinema e também as informações de endereço, eu quero que essas informações não estejam soltas e sim relacionadas, de alguma maneira, dentro da minha base de dados.

Para que no momento em que eu vou recuperar essas informações, por exemplo, através do verbo get para algum cinema qualquer, a partir de um ID, eu quero que essas informações retornem do no banco, não só um cinema mas também, o endereço relacionado a esse cinema. Então essas informações vão chegar carregadas, relacionadas de alguma maneira. Então no fim das contas, quando essa informação for retornada, além do nome do cinema nós queremos também trazer as informações do endereço relacionado a ele.

A mesma pergunta vale para o momento em que nós vamos inserir um cinema dentro do nosso sistema. Então no momento em que nós vamos efetuar um post para “/cinema”, essa é uma das perguntas que nós ainda vamos responder no próximo vídeo, na próxima aula, em que eu estou cadastrando um cinema, a pergunta que fica é: Será que um cinema pode existir sem um endereço?

Então vamos parar para pensar em uma situação do mundo real, se eu vou a algum cinema, ele precisa ter algum endereço para que eu consiga identificar a localização e possa chegar nesse lugar. Então será que faz sentido meu sistema poder criar um cinema sem um endereço para esse cinema previamente cadastrado?

A pergunta também vale para maneira contrária, será que eu posso ter um endereço sendo que não tem um cinema lá? Possivelmente mas, nós vamos responder essas questões no próximo vídeo.

E também nós precisamos entender como o Entity vai relacionar essas entidades? Então nós vamos começar a colocar a mão na massa partir de agora, já que nós queremos que um cinema tenha um endereço e esse endereço represente a localização de um cinema, para que nós possamos inserir um cinema agora com um endereço e também consiga recuperar essas informações no momento de uma consulta.

Só que isso nós vamos fazer na nossa próxima aula, onde nós vamos começar a colocar a mão na massa. Eu vejo vocês lá e até mais!

Sobre o curso .NET 5 e EF Core: relacionando entidades

O curso .NET 5 e EF Core: relacionando entidades possui 122 minutos de vídeos, em um total de 48 atividades. Gostou? Conheça nossos outros cursos de .NET em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda .NET acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas