esse vídeo vai ser um vídeo que vai dar início a uma série de vídeos aqui no canal de uma nova playlist que eu tô fazendo que eu chamei de jornada do Herói Isso vai ser muito legal porque a gente vai poder codar junto então a jornada do Herói nada mais é do que vídeos aonde a gente vai pegar um assunto um determinado tema e nós vamos codar do início ao fim eu coloquei lá no meu canal uma pesquisa e vocês votaram para colocar vídeos mais longos aqui no canal Claro manter os vídeos curtos que eu
já tenho mas ao mesmo tempo colocar vídeos mais longos para que a gente consiga simplesmente codar criar algo que a gente possa simplesmente fazer um teste ou até mesmo uma entrevista de emprego então tem várias coisas bacanas Então se tu tá curioso para saber um pouco mais sobre essa nova série tu não perde por esperar então fica aqui comigo pega teu café ou tua água que é o meu caso agora e bora lá fala galera Henrique jareta por aqui e para dar início a esse vídeo Nada melhor do que a gente falar sobre o nosso
querido crude né o nosso Create read update and delete Então a gente vai criar um crude completo aqui vocês podem ver que eu já comecei direto aqui com a tela do meu computador pra gente não perder muito tempo e a gente vai criar um crude utilizando o dnet 8 né E também utilizando Minimal api então no final dessa aplicação a gente vai poder ver no swager como é que tá funcionando a gente vai poder fazer interações no Swagger também para poder utilizar Nossa api então é um exercício bem bacana aqui que a gente pode simplesmente
usar para estudo a gente pode utilizar muitas vezes também para uma entrevista de emprego mas o intuito é realmente a gente conseguir codar algo do início ao fim então sem mais delongas pessoal aqui na tela do meu computador vocês podem ver que eu tô numa pasta qualquer aqui dentro do meu computador aonde essa pasta eu vou utilizar para que a gente consiga criar o nosso projeto ali do zero então o que que eu vou fazer eu vou abrir aqui o CMD eu tenho aqui um um CMD normal tá ele abriu aqui no outro monitor deixa
eu passar para cá eu tenho aqui um CMD normal se tu tá usando powershare ou se tu tem alguma estilização de CMD também não tem problema nenhum e aqui deixa eu só ver se eu consigo aumentar aqui perfeito aqui a gente vai conseguir dar o início do nosso projeto então o que que a gente vai criar a gente vai criar um crw básico de pessoas eu vou usar pessoas como exemplo Tá mas tu pode simplesmente utilizar qualquer outro exemplo tu pode utilizar qualquer outra regra tá então a primeira coisa que a gente vai fazer é
eu tenho aqui no meu computador a versão oito aqui do dotnet tá então essa versão aqui que eu vou utilizar se tu tiver utilizando a versão sete ou anteriores também não tem problema se tu tiver utilizando a versão 9 né que é a versão que vai ser lançada agora em novembro né que inclusive já tem um release candidate 2 que eu já tô gravando um vídeo aqui pro Canal também fica à vontade mas eu vou usar aqui a versão o tá se tu digitar aqui dne info tu vai conseguir ver quais são Opa dnet info
Tá tu vai conseguir ver quais são os sdc que tu tem instalado aqui então tu pode ver que aqui ó eu tenho esses dois SDK aqui instalados tá eu tenho do 2.2 e tenho do 8 que eu vou utilizar aqui nesse exemplo então o que que a gente vai começar Deixa eu só limpar aqui esse terminal deixa eu dar um um CLS aqui e vamos começar criando uma aplicação então eu vou criar um dnet New aqui a gente vai utilizar como exemplo uma API né então a gente pode utilizar aqui o Web api e aqui
eu vou utilizar o name da minha aplicação tá então o que que eu posso fazer aqui eu posso simplesmente estar traço traço name e posso colocar o nome que eu quero da minha aplicação eu vou colocar aqui como pessoa ou melhor como Person crw é eu vou utilizar o inglês aqui como base porque eu gosto bastante de codar em inglês mas se tu usa o português também não tem nenhum problema eu vou tirar o crud aqui também porque é uma signa então só colocar Person aqui e uma coisa interessante é eu posso aqui também utilizar
o menoso Né que é o output Ou seja eu vou est indicando pra minha aplicação que a saída dela vai ser do tipo pessoa né não do tipo mas vai ser do nome pessoa tá mas eu vou utilizar dessa maneira aqui porque essa maneira eu gosto bastante de usar o name também uma maneira diferente Lembrando que eu já tenho um vídeo completo aqui no canal sobre como criar um projeto do zero vou deixar ele linkado aqui porque eu explico tudo isso em mais detalhes tá E aqui eu vou utilizar também uma outra configuração que é
o traço Minimal aqui dessa maneira tá o que que esse traço Minimal aqui me diz ele me força a usar Minimal api né a gente sabe ali que depois ali do dnet 6 né a gente teve um grande avanço que foi a Minimal api ou seja uma forma diferente da gente trabalhar não utilizando controllers tá então eu vou utilizar esse exemplo aqui falando sobre minimum api também que é bem bacana então eu vou criar esse projeto aqui ó digitando errado também não não funciona né Deixa eu só deixa eu só botar aqui vai ser um
um dnet New tá vou criar esse projeto aqui tomar uma água enquanto isso e com esse projeto aqui criado pessoal eu posso vir aqui simplesmente dentro da pasta aonde eu criei e pode ver que eu já tenho aqui uma pasta Person né se eu vier aqui dentro dessa pasta eu já tenho aqui toda a estrutura básica de uma web api tá outra coisa que eu vou salientar aqui nesse nesse estilo de vídeo que eu tô fazendo eu vou tentar não fazer muitos cortes no vídeo vai ser um vídeo mais assim à vontade né para que
a gente possa estar codando um junto com o outro tá então esse vídeo ele vai ser mais longo como eu disse também vai ter menos cortes né do que eu costumo fazer nos vídeos tá então o que que eu vou fazer eu vou abrir aqui uma Instância do Rider e aqui no Rider eu vou simplesmente abrir aqui o meu CS PR aqui que ele criou tá como eu já tinha falado para vocês lá no início eu tenho um vídeo que fala muito muito sobre a criação né de um projeto então a gente pode criar um
projeto do zero utilizando CMD utilizando Solution também tá então eu não vou tratar nesse vídeo a questão de como criar uma Solution né um pon sln ou como criar uma Class Library uma Class Lib e depois dar um AD reference para essa Solution então tem coisas ali que eu já expliquei no vídeo né aonde a gente cria um projeto do zero Então eu vou deixar para vocês assistirem o vídeo caso tenha alguma dúvida Tá mas a primeira coisa que a gente vê aqui é que a gente já tem aquele mesmo processo né a gente já
tem aquele mesmo formato de arquivo opa deu pau aqui a gente tem esse formato aqui aonde tem as passas e tudo outra coisa importante é eu não vou me atentar em criar a arquitetura sabe eu vou me atentar mais na parte funcional logicamente se tu já tem um conhecimento a mais sobre dnet tu fica à vontade para tu poder mudar a arquitetura ou até mesmo para tu fazer algumas coisas diferentes Tá mas o que que a gente tem aqui a gente já tem uma API no próprio dnet aonde aqui ele dá como exemplo esse weather
forecast aqui tá então se eu vier aqui eu já vejo que eu tenho um map get e isso aqui gente é uma Minimal api porque ao invés de eu ter uma Controller que vai controlar isso eu já tenho dentro da minha program.cs aqui eu já tenho um map get de forma que se eu vier aqui e rodar minha aplicação né aqui eu cliquei para fazer o debug mas eu vou rodar minha aplicação vocês vão ver que vai abrir o swager tá deixa eu só pegar aqui no outro monitor deixa eu trazer para cá ó então
aqui eu já tenho meu swager da minha IPI rodando e aqui logicamente eu tenho somente o método get Aonde esse get aqui eu posso vir aqui e dá um Try It Out e simplesmente aqui ele vai me retornar né ele já me retornou aqui um 200 que é OK tudo certo conteúdo encontrada e aqui daí eu tenho um Jon com todo o conteúdo tá então basicamente o que a gente vai fazer é um crude aqui para mostrar aqui no swager de pessoa tá então vamos voltar aqui no Rider deixa eu parar aqui primeira coisa que
a gente vai fazer é o seguinte eu vou simplesmente tirar esse meu map get aqui tá vou tirar esse esses caras aqui tá vou tirar aqui também esse meu summary que eu não tô utilizando e vou tirar aqui também esse meu weather forecast aqui que eu também não tô utilizando vou deixar aqui ele o mais limpo possível tá só botar aqui no app Run e aqui daí a gente já consegue fazer algumas coisas então aqui que que eu posso fazer né só pra gente ver um pouquinho também porque a gente tem vários métodos aqui vários
verbos né como por exemplo wmap pmap catch assim como a gente tem também o os outros verbos né app.map né ou post a gente tem todos os os verbos aqui Pat post a gente tem delete então para usar uma minimum API a gente basta setar né esse map get que ele já vem por padrão mas aqui eu tenho dois parâmetros que eu vou colocar o primeiro parâmetro aqui é a rota então eu vou colocar Person que daí ele ficaria né quando quando for lá para pro pro browser ele fica ficaria barra Person tá Ele ficaria
dessa maneira Essa é URL aqui que ele passa tá e o segundo parâmetro aqui nada mais é do que um handler tá esse handler aqui é como que ele vai simplesmente manusear essa minha rota então eu posso simplesmente colocar aqui Olá pessoa tá em português mesmo e se eu colocar o mouse aqui em cima do Map get vocês podem ver que ele vai me dizer aqui ó Qual que é o tipo né que ele espera então se eu vier aqui ele vai me dizer aqui ó Qual que é o tipo que ele ele espera né
então aqui eu tenho o end Point né a Rot enfim eu tenho um padrão Eu tenho um handler então eu posso ter vários outros parâmetros aqui se eu vi aqui agora salvar e rodar minha aplicação vocês vão ver que vai mudar vocês vão ver que já vai aparecer ali um Olá pessoa deixa eu botar para cá de novo ó aqui vocês vê que já tem um Person já mudou eu posso vir aqui no try out quando eu dou um Execute ele já vai me retornar aqui 200 novamente Olá pessoa então é assim que o endp
na minimum api funciona tá e a gente pode fazer isso para todos os end points claro que a gente vai mudar isso no decorrer da do vídeo né da aula mas basicamente com esses dois parâmetros aqui eu já consigo fazer esse end Point rodar se por um acaso tu quiser porque normalmente quando a gente abre né quando a gente para a aplicação e abre ela de novo ele sempre abre numa nova Tab né o o swager aqui não dá para ver porque eu tô com um browser aqui no no outro monitor né eu tô deixando
esse monitor super Limpo aqui para que a gente consiga simplesmente visualizar o que que é necessário mas se tu quiser aqui dentro de properties launch settings.js existe essa propriedade aqui ó chamada de launch browser Ou seja quando ela tá true Ele sempre vai abrir uma nova aba se isso te incomoda tu pode vir aqui pode ver que aqui eu tenho pro http e aqui eu tenho pro https se isso te incomoda tu pode simplesmente vir aqui e colocar false que daí ele sempre vai abrir na mesma aba Eu particularmente gosto de sempre ter uma aba
nova né até porque quando eu tenho aba nova eu consigo comparar o que que eu tinha antes o que que eu tenho agora consigo fazer algum teste também mas antes funcionava agora não funciona então para mim na minha opinião é melhor mas fica à vontade tu pode simplesmente trocar isso agora a gente pode começar já a fazer algumas melhorias tá primeira coisa que a gente tem que se atentar aqui é o seguinte como eu falei para vocês Deixa eu só Minimizar aqui aqui eu posso ter por exemplo o meu map get eu posso ter o
meu map post putch delete patch eu posso ter vários aqui só que vocês entendem que quando eu tenho uma rota Person mas aqui eu tenho um handler e esse handler é tipo o que que eu tenho que direcionar o que que eu tenho que fazer dentro desse método isso pode ficar métodos muito extensos né E isso pode poluir aqui dentro do meu program.cs que basicamente é o arquivo principal digamos assim aonde eu tenho as configurações da minha aplicação o que que eu gosto de fazer eu gosto de dividir isso eu gosto de ter um outro
lugar aonde eu vou cuidar somente dessas rotas então aqui pra gente ser um pouco mais pragmático aqui novamente sem precisar criar camadas e tudo eu vou criar uma nova um novo diretório aqui e eu vou colocar aqui como routes e aqui dentro de routes eu vou criar uma nova classe chamada de Person route e essa classe Person route ela vai ser responsável por ter todos os end points a primeira coisa que eu posso fazer aqui ia já transformar ela como static tá Por quê Porque eu não preciso instanciar ela como eu tô falando de Controller
que é a primeira camada que eu tenho de interação com o usuário basicamente Quando eu der o load Quando eu der o build na minha aplicação essa classe já pode estar instanciada Porque daí eu não perco tempo tendo que instanciar ela enfim a própria aplicação já já gerencia isso para mim então vou deixar ela aqui como estática e aqui eu vou criar um método para poder buscar todas essas rotas para poder ter todas essas rotas então aqui eu vou colocar um Public static tá Vou colocar aqui como void vou colocar aqui como Person routes certo
e aqui também eu vou inicializar vou ter o meu método aqui um detalhe muito importante como eu tô utilizando aqui ó gente como eu tô utilizando uma classe estática os membros dessa classe também tem que ser estático tá deixa só tomar uma água aqui e quando eu tenho esses membros estáticos tá quando eu tenho essa classe estática todos os membros T que ser estático então só cuidem disso mas aqui eu tenho que passar um parâmetro Qual é o tipo de parâmetro que eu vou passar bom se eu voltar aqui na minha program.cs eu vou dar
aqui um app. mapguide que eu colocar aqui um web application como app por exemplo dessa maneira aqui e quando eu utilizo dessa maneira eu já consigo ter o app. mapgetters ah organização de ciclo de vida né transient scoped que eu simplesmente tirei isso da da responsabilidade da program e coloquei em outra classe Teve muitas pessoas que falaram assim Ah tu só tirou a bagunça do quarto e colocou na sala gente não é isso Isso é uma forma de organização que a gente tem dentro da nossa api porque se der qualquer problema a gente sabe que
está dentro daquela classe então a classe ela tem uma razão somente para existir tá isso é um conceito muito interessante né que enfim até até tem o conceito da responsabilidade única né o s do Solid né que a gente estuda então É nesse ponto que eu penso eu penso em criar uma classe aqui aonde essa classe pode simplesmente cuidar de tudo isso tá e como é que eu posso usar isso voltando aqui na minha program eu posso simplesmente vir aqui e chamar o meu Person Person route pon Person routes tá posso fazer dessa maneira aqui
e como o meu Person routes ele espa um web application eu passo o app aqui pronto o problema já está resolvido só que qual que é o problema que ainda resta aqui pode ver que dentro desse arquivo aqui eu sigo um padrão que é app. app pon app P app pon e aqui eu tenho um Person route pon e eu fico Opa quebrei esse padrão tá como é que a gente pode simplesmente utilizar isso de uma maneira mais inteligente a gente faz isso utilizando um conceito muito legal que se chama extension methods e eu também
já tenho um vídeo completo aqui no canal só falando sobre extension method eu vou deixar ele aqui no card linkado também para vocês entenderem mas basicamente eu uso a própria Instância né para poder dizer que ele é um método de extensão ou seja eu tenho um método base mas eu quero estender ele a outros recursos eu quero estender ele a outros métodos como é que eu faço isso muito simples é só colocar a palavra reservada dis aqui na frente e automaticamente ele já vai entender que é um método de extensão então o que que eu
posso fazer aqui pode ver que ele já deu uma mensagem de erro ó invoc esx attention method eu posso simplesmente vir aqui e dar um app.on Person routes dessa maneira aqui e eu já vou est chamando todas as rotas que eu tenho dentro da minha Person route Se vocês forem ver eu tenho somente o get né então se eu vier aqui e executar ele tem que manter o mesmo comportamento Só passando para cá de novo ó eu tenho aqui a minha rota Person tá que é o get que a gente não alterou nada e se
eu vier aqui no try out ele já vai retornar aqui também novamente ó do 200 e aqui Olá pessoa que é o comportamento que a gente tinha como padrão então aqui o nosso extension method ele funcionou de maneira exemplar agora o que que eu posso fazer aqui né para começar já a codar isso bom como a gente vai trabalhar nessa aplicação também com uma parte do ORM né do entity Framework a gente vai usar o picolite aqui eu vou simplesmente criar uma classe que vai ser a classe de modelo né a gente tem um conceito
que basicamente a modelo é o que Vai representar o nosso banco de dados né ou ser mais próximo que isso então o que que eu vou fazer aqui dentro de Person eu vou criar um novo diretório chamado de models e aqui dentro de models eu vou criar uma classe chamada de Person Model tá ou simplesmente Person como tu bem preferir Tem muita gente que diz ah como eu já tô aqui dentro de models Eu não tenho necessidade de colocar aqui o Person Model porque fica redundante não tenho necessidade de colocar esse sufixo bom fica teu
critério tá eu uso ambas maneiras Isso depende muito do projeto de de como tá todo o escopo mas eu vou utilizar aqui como Person Model Deixa eu só parar aqui minha aplicação e dentro desse Person Model eu tenho que ter algumas propriedades a primeira logicamente vai ser um prop gid onde eu vou colocar como ID tá então aqui entra um ponto muito interessante que é a questão do guid né ou gid como tu preferir que é o Global Unic identifier que é um identificador único realmente para criar ids então se tu vier aqui por exemplo
e ver como que é o formato do guid né a gente tem aqui esse formato aqui aonde a gente tem 32 caracteres se eu não me engano tá aonde a gente consegue simplesmente ter uma gama maior de caracteres a gente consegue salvar isso no banco de dados como que isso funciona né como por que que isso é bom porque o risco de eu ter dois ids iguais é quase zero eu não tenho dois ids iguais se eu tivesse um ID sequencial no banco como 1 2 3 4 eu tivesse que fazer uma migração de dados
para outro Database provavelmente eu ia ter um conflito se eu não configurasse isso bem lá no meu ID para ser um auto incremento Enfim eu posso ter um conflito de por exemplo Ah eu já existe o id4 no outro Database o que que eu faço então por isso que a gente utiliza o gid só que qual que é o problema dele ele precisa basicamente de mais ciclos de processamento né por ele ter mais caracteres por ele ser maior enfim eu tenho que ter um processamento maior e isso a nível de banco de dados pode ser
uma coisa que não tão interessante dependendo do tamanho da tua aplicação então aqui eu vou usar gid tá vou usar ele como padrão Eu gosto bastante de usar gid só que como eu falei muitas vezes as pessoas utilizam int long fica o teu critério mas aqui eu vou utilizar o wid e aqui eu também vou ter uma propriedade string chamada name tá E essa propriedade aqui como ela é uma string ele já vai me dizer olha no nullable property name is analized então o que que eu posso fazer eu já posso inicializar aqui como uma
string P empt por quê Porque aqui dentro do meu CS pro por exemplo eu tenho essa opção aqui ó que é o nullable e ele tá com enable Então essa opção vai fazer com que todas as propriedades variáveis enfim que são passíveis de nulo e eu não exemplificar isso eu não dizer olha esse aqui pode ser nulo ele vai sim dar essa mensagem aqui de string pemp né se eu tirar aqui o string pemp ele vai dar essa mensagem de que e não está inicializado então o que que eu posso fazer eu posso simplesmente dizer
que ele é nulo né posso colocar um nullable Mark aqui que é um question mark tá eu posso simplesmente vir aqui e dizer que vai ser um Public required required string tá que ele também já vai sair aqui e eu posso simplesmente utilizar aqui também né um string pemp Claro além de ter um Construtor para fazer tudo isso tá então basicamente eu vou usar essas duas propriedades aqui para poder exemplificar uma mudança que eu vou fazer aqui é o seguinte eu vou colocar o meu guid aqui como init ao invés de eu utilizar o set
tá então o que que o init aqui me diz ele me diz que ele vai funcionar somente quando tiver o Construtor né quando eu chamar essa classe eu só posso alterar ele uma vez a gente também tem aquele conceito do nosso Private read only que vocês já viram muito em Construtor né aonde eu só posso alterar uma vez e depois eu não altero mais então o init ele é muito bom Eu normalmente não gosto de pessoa que bota set público para tudo tá então se a gente for mais a fundo em DDD né domain driven
design né orientada a domínio vocês vão ver que tem várias regras né V não regras Mas tem várias boas práticas né uma delas é o Private set dessa maneira aqui né então por exemplo eu digo que a única parte da minha aplicação que é responsável por cuidar das minhas propriedades que estão no modelo é o próprio modelo tá então é isso que eu vou fazer aqui eu vou simplesmente colocar o meu Private aqui como set tá o meu Desculpa o meu set aqui como Private e a gente vai conseguir ver que depois a gente vai
ter um método aqui para poder alterar então vai ficar bem bacana E claro aqui para nós finalizar vamos usar o nosso bom e velho Construtor tá aonde nesse Construtor eu vou passar uma string name e aqui dentro eu vou do consultor eu vou simplesmente fazer a atribuição Então o meu name ele vai ser igual ao name que eu tô passando mas o meu ID eu não preciso passar lembra que o meu ID ele tá com como init tá ou seja ele já vai ser inicializado no Construtor então quando eu coloco ID igual a guid pnew
guid dessa maneira aqui eu já tô automaticamente dizendo toda vez que chamar essa classe aqui toda vez que eu instanciar ela ele já vai gerar um ID novo e vocês podem ver que quando eu uso o Construtor o meu string pemp ele já se torna digamos assim sem uso né porque eu já vou ter uma inicialização que é o meu Construtor então isso aqui eu eu já posso tirar então a gente criou aqui a nossa nossa modelo tá basicamente que a gente vai utilizar e agora a gente pode fazer outras coisas né a gente vai
voltar nessa modelo aqui mas a gente pode fazer outras coisas aqui para poder melhorar ainda mais então voltando aqui pessoal nas minhas rotas Olha que interessante quando eu chamo aqui lembra que eu tenho a minha rota e eu tenho o meu handler tá ao invés do meu handler passar aqui uma string como Olá pessoa agora eu já tenho uma classe que cuida da pessoa então eu posso dar um New Person Model tá E esse Person Model ele espera o quê ele espera um nome então aqui eu já vou colocar como Henrique por exemplo Quando eu
fizer isso né e salvar e rodar de novo a aplicação vocês vão ver que automaticamente Quando eu der o get na aplicação ele já vai me retornar o a pessoa né como Henrique então aqui já abriu Deixa eu só passar aqui pro lado de novo ó eu já tenho aqui o meu Person não mudou nada mas quando eu der um try out get olha só que interessante ele já me retornou o objeto né ele já me retornou 200 tudo certo né a gente tem http status né como 200 D4 que é no content aí a
gente tem as outras partes de 400 500 enfim isso é uma coisa legal de estudar também mas a gente tem aqui o retorno que ele retornou o id e ele retornou como Henrique repara uma coisa o meu ID Aqui termina com 68 Se eu der um try um Execute again Execute again é óo né se eu executar novamente ele já vai mudar aqui ó pro B5 vou executar novamente ele já vai mudar aqui pro 46 então toda vez que eu executo isso eu tenho um ID novo e é isso que o o gid pnew gid
ele me dá só que muito além disso pessoal se eu voltar aqui como eu tenho um gid p New gid aqui significa que eu já sei qual que vai ser o ID antes de eu inserir ele no banco de dados Então isso é uma vantagem muito grande também se eu quiser fazer uma validação antes de inserir ou qualquer coisa do tipo eu já tenho o ID diferente do id incremental né que eu não tenho como ter certeza qual que vai ser o ID Então isso é muito legal também do de utilizar o guid agora que
a gente já terminou isso a gente pode ir por uma outra etapa que é a etapa do banco de dados Tá novamente eu vou utilizar aqui uma parte do ORM né do entity Framework que se chama C Light Eu também já tem um vídeo completo aqui no canal sobre siol Light que eu vou deixar ele aqui linkado uma água e para utilizar o c Light a gente tem que fazer algumas coisinhas que eu particularmente gosto de fazer primeira coisa é eu vou criar aqui dentro do meu projeto eu vou criar aqui um diretório chamado data
tá E aqui dentro do meu data eu vou criar uma classe chamada de DB context ou app context eu vou usar aqui como Person context que eu acho que é melhor pon CS tá essa classe Person context ela já vai herdar de DB context só que a gente precisa instalar algumas coisas antes da gente poder utilizar basicamente a gente tem que instalar instalar três coisas a primeira é a gente tem que utilizar a versão Global do entity Framework por quê Porque a gente vai utilizar comandos como dnf Database update migration Z Então a gente tem
que ter isso instalado Então vou vir aqui no meu terminal e aqui dentro deixa eu só dar um Clear aqui para ele poder limpar eu vou executar Esse comando aqui ó dnet Tool install a versão Global do que do dnet ef aqui eu vou colocar como a versão número 8 tá Ah Henrique mas eu não sei como achar isso aí vocês podem vir aqui no Google tá e colocar assim ó dnf Global Install e vocês vão cair já direto aqui no site da Microsoft aonde tem né o cli aqui né o cli Aonde vocês vão
conseguir pegar esse comando tá então eu eu vou executar Esse comando aqui e aqui ele já foi aqui reinstalado provavelmente eu já tinha instalado nele enfim mas O interessante é que ele já tem aqui dentro e eu preciso instalar duas coisas a mais tá o primeiro é o entity Framework Core que a gente vai utilizar e o segundo é o cle Light Eu normalmente não gosto de instalar por linha de comando isso porque aqui dentro do Rider e no visual Studio também já tem isso no visual Studio code é um pouquinho mais difícil sei que
tem extensões para isso mas a galera que me conhece sabe que eu gosto de usar bastante é né em comparação a a editores de código né editores de texto como visual Studio code mas aqui dentro do nugget aqui do do pacote aqui que eu consigo manusear que eu consigo gerenciar eu vou digitar aqui entity Framework frame eu vou instalar esse aqui ó entity Framework Core tá que é o que a gente precisa e aqui ele já vai me dar com a versão número nove né que é a versão que a gente a está como release
candidate né que é esse orc Mas como eu tô utilizando a versão o eu vou colocar a última versão o que tem aqui e vou adicionar aqui dentro do meu projeto outra coisa que eu vou adicionar aqui é o meu entity Framework Framework Core pcle eu vou utilizar esse aqui ó o cqu aonde eu vou ter que instalar ele também tá tá ele também vai me dar com a versão nove aqui Tomei muito cuidado com isso a gente tá na versão utilizando a versão oito então assim que ele liberar a versão aqui ó eu já
venho aqui e mudo pra versão oito e adiciono no meu projeto e por fim depois de adicionar isso eu preciso ainda ter um outro contexto que é adicionar o design né o dnet o entity Framework Core design esse carinha aqui o que que o design faz como a gente vai trabalhar com migrations tá é muito importante que a gente tenha esse design instalado porque o design é que vai cuidar de toda essa questão de criar as migrations quando a gente trabalha com entity Framework Core por exemplo a gente tá simplesmente trabalhando com code first o
que que é isso a gente não precisa mexer em código seol a gente não precisa criar o banco de dados na mão a gente cria o nosso código csharp e com isso a gente consegue através das migrations pegar o nosso código csharp e converter ele para código pon né e a gente pode utilizar diversos providers né como picl Light cle server post enfim tem vários e vários providers que a gente pode utilizar terminado aqui pessoal a gente pode vir aqui ó no Person context e simplesmente herdar de DB context tá dessa maneira aqui porque lembra
que o DB context esse carinha aqui ele nada mais é do que a representação do nosso banco de dados então eu sei que no meu banco de dados eu vou ter um Person context né que a gente pode traduzir como um banco de dados mesmo né um banco de dados que a gente tem lá o nosso provider do banco de dados mas eu preciso simplesmente dizer quais são as tabelas que vai ser então se o meu DB context é o símbolo né a simbolização da minha do meu do meu banco de dados em memória o
meu vou criar uma prop aqui o meu DBS dessa maneira aqui DB set eu vou colocar aqui como Person Person Model tá Vou colocar aqui como como people por exemplo n colocar no plural aqui o meu db7 aqui vai ser ação da minha tabela em memória de qual tabela que eu tô falando tabela por Model né tabela pessoa se eu tivesse aqui por exemplo a tabela carro eu teria um outro DBS eu teria enfim eu teria quantos dbss forem necessários de acordo com as tabelas do meu banco de dados tá então esse é o primeiro
ponto que a gente tem para configurar o entity Framework aqui o segundo ponto é a gente tem que dar um override num método que é muito conhecido que se chama o método on configuring dentro do entity Framework então eu acredito que se tu digitar aqui overwrite override on configuring ou melhor vamos só on configuring Public override on configuring esse método aqui é o método que a gente vai ter que sobrescrever tá esse on configuring pode ver que ele já trouxe aqui todo como cinza como se não tivesse sendo utilizado porque a gente ainda não tá
utilizando ele o que que a gente tem que configurar aqui a gente tem que configurar qual que vai ser o nosso provider de banco de dados então como eu falei para vocês a gente vai utilizar o cite então o que que eu posso fazer aqui dentro eu vou utilizar aqui o meu options builder puse cite tá dessa maneira aqui use opa pera aí use cle cle Light tá E aqui dentro do use cle Lite eu tenho aqui o meu data search né que é a minha Connection string então aqui dentro do meu data search eu
tenho que colocar a Connection string de acordo com cada provider que eu tenho e aqui eu vou fazer só uma alteração porque ele dá datas PP e aqui eu vou colocar como cle cle tá se por um acaso tu não souber qual que é o formato da Connection string tem um site muito bacana também que é esse aqui que é connections Connection string.com tá esse site aqui ele vai dar o modelo de Connection string de todos os providers que a gente tem então se eu vi aqui por exemplo Ah eu não sei qual que é
o do Cle Light eu posso vir aqui no cle Light e posso simplesmente ver aqui aqui ó Qual que é o formato ó data sece igual e daí o banco de dados né posso ver que esse é o formato Então esse site aqui é bem bacana porque a gente consegue ver qual que é o formato de Connection string pra gente não errar tá então vou voltar aqui pro código eu já tenho aqui o meu Person cle Light tá então basicamente a gente já consegue utilizar dessa maneira a gente não precisa mudar mais nada aqui nesse
arquivo agora e para finalizar aqui a gente tem que fazer a injeção desse cara aqui dentro do nosso program.cs eu não vou entrar aqui nos méritos de ads scoped trans and single porque eu também já tenho um vídeo bem completo no canal sobre isso eu vou deixar ele linkado aqui no card isso é o mais bacana dessa série que eu pensei para vocês por quê Porque nessa série por mais que o vídeo seja mais longo a gente consegue unir todos ou vários conhecimentos aqui do canal a gente consegue unir numa aplicação tá então pra gente
poder injetar aqui eu vou utilizar aqui ó builder P Services ponto AD scoped eu vou utilizar o AD scoped aqui e qual que vai ser o tipo né do meu AD scoped vai ser o meu Person context esse carinha aqui então com essa linha aqui de código né eu já tô injetando né a gente a gente fala muito sobre Ah tem que injetar isso no contêiner né O que que é esse contêiner a gente fala aqui da questão da program.cs então aqui eu já tô injetando essa minha conexão com banco de dados feito isso a
gente já pode dar um passo além que é o passo agora de criar a nossa migration imagina o seguinte a gente já tem o nosso Person context configurado a gente já tem o nosso program.cs configurado né com a injeção do nosso Person context então agora a gente pode gerar a nossa primeira a nossa primeira migration para depois atualizar o banco de dados então o que que eu vou fazer eu vou vir aqui no terminal tá e vou simplesmente digitar aqui ó dnet ef migration AD aqui é migrations AD Se não me engano depois a gente
pode a gente pode verificar e eu vou colocar aqui o nome dela como initial tá Normalmente quando é a primeira migration a gente coloca como enfim initial ou como Creation ou como enfim qualquer nome que remeta a ser a primeira migration então aqui eu vou clicar no enter né vou vou vou iniciar Esse comando aqui e se der tudo certo ele vai ele vai buildar e vai criar ali a migration enquanto ele cria então é uma água novamente perfeito a nossa migration aqui foi criada tá então vocês podem ver que foi adicionado aqui mais uma
pasta no nosso projeto chamado de migrations e dentro dessa migration eu tenho aqui a minha migration inicial com o nome que eu coloquei a migration ela tem duas funções principais tá que a gente chama de Up e Down o Up nada mais é do que tudo que a gente tem que colocar no banco de dados tudo que foi alterado tudo que foi criado Então se tu for ver aqui no comando o que que ele tá fazendo ele tá criando uma tabela com o nome people tá aonde nessa tabela ela ele tem dois Campos O primeiro
é o o gid Né que é o nosso identificador ele colocou aqui como texto né porque a gente tem os eens ali logicamente a gente pode formatar o gid para tirar os eens para ele ser um pouco menor mas não é o intuito desse vídeo aqui tá e ele também colocou aqui uma coluna chamada name do tipo string aonde vai ser um texto e eu também não setei se vai ser nullable false true enfim eu não coloquei isso tá e a automaticamente como toda tabela tem que ter ele já seta aqui uma PK né que
é uma primary Key então a gente não consegue ter tabelas né quer dizer não consegue é forte mas não é o intuito ter tabelas sem primary Key se a gente tem uma foreign Key a gente até pode ter tabela sem foreign Key então isso não é um um grande problema mas referente a primary ke eu vejo que isso tem que ter em todas as tabelas principalmente que a gente tá falando de Cicle tá então isso é muito importante e a gente tem o Down também que o Down é o seguinte se eu quiser reverter a
situação como é que eu faço bom eu tô criando a tabela agora então logicamente se eu quiser reverter é só dando um drop table por isso que é muito importante a gente não fazer nada manual pessoal quando a gente tá utilizando migrations a gente tem que fazer tudo tudo por dentro das migrations a gente pode dar um undo na migration né um remove aonde ele vai voltar ao estado Inicial mas é importante que tudo isso fique dentro da migration só que por si só a migration ela não altera nada no meu banco de dados então
eu posso criar quantas migration eu quiser aqui e o meu banco de dados não vai est atualizado eu preciso rodar um outro comando para atualizar e qual que é esse comando depois que eu criei a minha migration eu ten que eu tenho que rodar um comando chamado dnet ef Database update dessa maneira aqui tá esse comando aqui é o nosso commit nosso famoso commit do tipo Olha eu tenho aqui manda bala pro meu banco de dados É esse aqui o nosso comite então se eu fizer isso aqui ele vai como eu tô criando agora né
em primeiro momento a tabela ele também vai ter que criar o banco em primeiro momento né porque eu não tenho esse banco e olha só que interessante depois que ele criou aqui e ele já falou aqui olha eu já apliquei a migration ó essa migration initial porque é a primeira que a gente tem e se vocês forem ver aqui ó eu já tenho um novo arquivo chamado Person psicol Light que é o nosso banco de dados e como eu gosto muito de utilizar o Rider eu posso vir aqui no meu Database né Explorer que é
esse carinha aqui e posso simplesmente arrastar o meu banco de dados aqui e eu já vou conseguir verificar e conectar ó vou dar um test Connection aqui eu já vou conseguir abrir o meu banco de dados ó vou dar um ok e olha só que interessante o meu banco de dados tá aqui eu tenho Person e aqui dentro de Main eu tenho três tabelas e isso aqui é muito importante porque a primeira tabela que eu tenho é migrations History toda vez como eu tô utilizando o o entity Framework né como eu tô utilizando um ORM
E lembra que eu falei tudo tem que ser com base em migrations a gente não pode fazer nada manual toda migration que a gente cria pessoal ele vai criar uma história né um histórico digamos assim dentro dessa migration History por isso novamente nunca façam nada manual do tipo ah eu não quero essa migration eu vou só excluir o código e rodar de novo não a gente tem que fazer pela própria migration para que fique atualizado toda essa questão de History e aqui eu também tenho people né que foi a tabela que eu criei tanto que
se eu vier aqui e dar dois cliques ó eu tenho somente o id e o nome que enfim eles não existem ainda né que eu não criei nenhuma pessoa Então olha só que Inter interessante a gente já tem o banco de dados aqui a gente já tem o nosso Cicle Light Tá e agora a gente pode já partir pro próximo ponto eu vou começar aqui pessoal criando o post tá pra gente já ir colocando pessoas dentro da nossa tabela Só que tem um conceito muito legal que eu gosto de utilizar que é o seguinte claro
que aqui dentro da nossa lógica né o Person não Person context aqui dentro da minha modelo da minha personal Model a única coisa que eu preciso para criar uma pessoa é o nome mas imagina que eu tenha por exemplo nome idade CPF endereço e blá blá blá eu tenho uma gama de propriedades e essas propriedades são necessárias para criar pessoa eu tenho que passar ela no parâmetro do Meu método mas agora imagina que eu tenho nome vírgula idade vírgula CPF vírgula endereço Nossa fica um um um um monte de parâmetros ali e é difícil da
gente conseguir se organizar Eu gosto de trabalhar com arquivos de requisição né E claro indo muito mais além A gente trabalha com request response mas aqui eu vou trabalhar só com arquivo de requisição então eu vou fazer o seguinte eu vou vou criar uma nova classe aqui dentro de models mesmo eu vou colocar aqui ó Person request Ah dessa maneira aqui esse Person request eu até poderia utilizar criar uma prop aqui e colocar string name né que é o que eu preciso para poder né criar uma pessoa só que pensa comigo o seguinte eu vou
ter uma classe que a classe gente Ela é super complexa digamos assim ela pode ter métodos ela pode ter características eventos e blá blá blá pode ter propriedades também que é o caso aqui mas imagina que eu vou ter que usar toda essa Gama eu vou ter que controlar toda essa Gama simplesmente para colocar um nome ali na tela que que eu gosto de fazer em caso simples assim eu gosto simplesmente de ignorar tudo isso aqui e Eu transformo isso num Record tá E esse Record aqui eu simplesmente digo que eu quero um string name
e é isso a minha classe de requisição Eu já também referente ao Record Eu tenho um vídeo aqui no canal Super completo vou deixar aqui no card também porque eu não vou explicar aqui o que que é o record não é o motivo do vídeo Mas tu pode ir lá naquele vídeo e olhar também depois que eu tenho esse meu request eu já posso utilizar ele então o que que eu vou fazer eu vou voltar aqui pro meu arquivo de routes e aqui ao invés de ter um um map get tá dessa maneira aqui eu
vou excluir depois a gente vai fazer logicamente eu vou utilizar aqui um map post map post aqui E esse map post a rota dele vai ser Person E logicamente eu vou ter que ter um handler aqui tá vou ter que ter um um handler aqui para poder controlar tudo isso só que olha só que interessante eu tenho um handler aqui no meu map post mas eu preciso criar o meu map get né map get eu preciso criar o meu map delete por exemplo só que vocês podem ver que todos os Maps que eu tô criando
aqui eu tô criando Person Person Person porque a rota é a mesma o que muda vai ser o nosso verbo http post get delete isso vai mudar mas a rota é a mesma daí tu vai me perguntar Henrique mas toda vez que eu fizer isso eu vou ter que colocar por exemplo que vai ser um map post Person map get Person não a gente pode utilizar um recurso aqui bem legal das minim minimum api que é o map group então o que que eu vou fazer aqui eu vou criar uma variável aqui dentro como route
e vou simplesmente ou melhor Deixa eu pensar route route eu vou criar como route e vou dizer que ele vai ser um app.map group map group tá e qual que vai ser o meu map group vai ser o meu vai ser Person que vai ser o meu prefixo aqui né vai ser a minha rota Então a partir do momento que eu tenho isso eu não preciso mais utilizar os Maps da forma que eu tô utilizando aqui então eu posso simplesmente apagar tudo isso aqui e posso utilizar agora o meu route pon map poost e como
o map poost existe um parâmetro eu vou colocar vazio aqui por quê Porque o meu primeiro parâmetro aqui que é a minha rota já está aqui mapeado dentro da minha variável rota que eu utilizei o map group Então dessa forma tu não precisa escrever toda a hora e ainda tu corre o risco muitas vezes de escrever errado a rota né não precisa porque tu define ela uma vez e também se eu precisar mudar Putz agora todos os meus end points vai ser como pessoa dois vamos supor um exemplo bem esdrúxulo Tá mas vamos supor que
é tu vem aqui só nessa variável aqui troca já vai funcionar para todos então o que que eu preciso aqui para criar uma pessoa tá lembra que a gente criou um arquivo de requisição que é do nome tá mas também eu preciso do meu banco de dados né Por quê Porque eu preciso fazer as transações do meu banco de dados Então a primeira coisa que a gente vai fazer aqui eu vou colocar um parênteses e eu vou pedir lá o meu arquivo de requisição que o nome dele é Person request então eu vou colocar aqui
ó Person request como request dessa maneira aqui mas eu também preciso de outro parâmetro aqui que vai ser o meu banco de dados então aqui eu vou ter o meu como é que eu vou ter o nome do banco de dados aqui coloquei como Person context tá ter o meu personal context aqui como context dessa maneira aqui eu consigo já fazer né passar os parâmetros tá logicamente eu vou adicionar aqui né porque eu preciso colocar aqui as as referências tá então aqui eu já tenho os dois parâmetros que eu preciso porém todavia entretanto pessoal vou
até dar um enter aqui para ficar mais simples a visualização Eu tenho um conceito né Às vezes as pessoas também me xingam ah porque não é assim que funciona hque tem que pensar um pouco melhor mas só tomar uma mágua aqui de novo mas eu tenho um conceito pessoal que é o seguinte 99% dos casos tá sempre que a gente mexe em banco de dados tem que ser assíncrono ponto final tá sempre tá a não ser que eu tenha que ter algo muito específico que ele vai ser síncrono eu tenho que controlar isso mas como
a gente tá trabalhando com banco de dados e a gente sabe que a gente não precisa somente ocupar uma thread a gente pode ter várias ali trabalhando a gente precisa dessa assincrona eu gosto de utilizar sempre assíncrono então eu sempre coloco async aqui antes né Essa palavra reservada aqui ela vai me dizer que essa requisição vai ser assíncrona tá E com isso eu já consigo lógico depois eu vou ter que dar o await aqui né para poder simbolizar isso para poder firmar que ele é um um ayn mas agora eu já posso criar aqui o
meu a minha pessoa então o que que eu vou fazer eu vou criar um var Person e aqui eu vou dar um New Person Model dessa maneira aqui e o Person Model ele espera o qu ele era um nome e aonde é que tá esse nome pessoal tá dentro da minha requisição que foi o arquivo que eu criei então eu vou colocar aqui hack pname dessa maneira aqui eu já vou ter a Instância né de uma pessoa né quando eu dou um New significa que eu tô criando uma Instância então agora o que que eu
posso fazer eu posso simplesmente utilizar o recurso que eu tenho do meu context Então vou utilizar await context pync e vou colocar a pessoa Então olha só o que que eu tô fazendo eu tô dizendo uma pessoa para mim com o nome que eu passei e agora adiciona essa pessoa para mim aonde dentro do context que o context é o qu pessoal é o meu banco de dados aqui ó ele tem a Instância do meu banco de dados porém toda viia entretanto né Isso não vai dizer que a pessoa vai estar no banco de dados
eu posso criar quantos AD a que eu quiser posso fazer quantos quantas mudanças eu quiser ele não vai adicionar no banco de dados até eu fazer o commit e como é que é feito o commit aqui eu vou utilizar await context P save Change ayn save Change ayn esse save Change ayn repara aqui como eu tô utilizando ayc aqui eu tô utilizando ayn e ayc também tudo tem que ser assíncrono com esse comando aqui é o commit é quando a gente realmente vai lá no banco de dados lá no no cle server da vida e
dá um um commit lá a gente já consegue simplesmente ter essas alterações então com isso se tudo der certo eu já vou conseguir deixa eu rodar aqui minha aplicação eu já vou conseguir adicionar uma pessoa dentro da minha aplicação né dentro do meu banco de dados hum Ixe molhou Tod aqui Bom vamos lá aqui ele já abriu para mim o o swager tá deixa eu só pegar o swager aqui e botar aqui na tela olha só que interessante agora ao invés de um get Eu tenho um post por quê Porque eu tô utilizando um map
post e aqui ele já Quando eu der o try out ele já vai pedir aqui o parâmetro que é o nome que vem lá da minha requisição então aqui eu vou colocar como Henrique giareta e vou dar um Execute se tudo ocorrer bem ele vai me retornar aqui um 200 e como eu não tenho nenhum tipo de response né como eu não configurei nenhum tipo de response ele só vai me retornar ali ah os headers que deu tudo certo vai me retornar um 200 porém todavia entretanto se eu vi aqui no meu banco de dados
e ver aqui dentro da pessoa olha que interessante eu já tenho tenho aqui o meu ID e a pessoa criada então o nosso fluxo funcionou primeira etapa do nosso crude a gente terminou com três linhas de código ali dentro da nossa Minimal api agora a gente pode partir pro próximo passo né que vai ser o get vamos fazer o get Porque daí a gente já consegue fazer tudo pela pela interface ali do swager Então como é que eu vou fazer esse get deixa eu Minimizar aqui parar aqui minha aplicação como é que eu vou fazer
esse get bom eu já tenho aqui uma fórmula uma receita digamos assim então eu vou utilizar aqui o meu route p mapgetters dessa maneira aqui como eu não preciso colocar a rota que eu já tenho aqui Person eu vou simplesmente deixar em branco e vou colocar o meu segundo parâmetro qual que vai ser meu segundo parâmetro pessoal vai ser o meu banco de dados então eu vou colocar aqui entre parênteses eu vou colocar aqui óó o meu App não desculpa é Person DB context ou Person context foi assim Person context tá e eu vou colocar
aqui como context vou utilizar ali o mesmo padrão do do outro tá E aqui ao invés de eu utilizar simplesmente dessa maneira eu vou colocar um aqui na frente porque vocês sabem que a gente tá trabalhando com banco de dados tá que que eu vou fazer aqui eu posso simplesmente ter aqui uma var people como vai ser no plural né então eu posso ter uma ou várias pessoas eu vou dar um await para simbolizar ali o meu o meu await context people que é o nome da minha tabela people p list Aim posso utilizar dessa
maneira aqui tá Então olha só que interessante automaticamente como eu tô utilizando inferência de tipo aqui eu não tô dizendo qual que é o tipo explicitamente do Ó vai ser uma lista de Person Model Mas eu posso utilizar o var que é a inferência de tipo que a gente chama e automaticamente pelo contexto aqui da atribuição né eu tenho o sinal de igual que eu tô atribuindo aqui ele já vai identificar Qual que é o tipo da minha variável Então olha que interessante eu dei um await context que é o nome da minha tabela Peguei
todos os registros e passei pro meu two list async Então essa variável aqui ela já vai retornar já vai estar populada com todas as pessoas que eu tenho dentro da minha tabela e como eu preciso retornar isso eu posso simplesmente dar um return dessa maneira aqui tá um return posso colocar aqui ó results P ok né e posso colocar aqui que ele vai retornar o people dessa maneira então o que que é esse results aqui ponok esse results já é inerente né a gente já tem isso principalmente dentro das classes Controller base e Controller e
a gente consegue ter várias opções aqui como por exemplo encontrou as pessoas retorna eu posso retornar aqui ó um Bad request posso retornar aqui ó um not found então isso aqui é muito interessante ou no content que é um 204 né então eu posso simplesmente verificar aqui e utilizar Tem muita gente que utiliza assim if people for igual vazio retorna um no content ou um not found enfim ou por exemplo ah se eu passei algum parâmetro se o parâmetro veio vazio retorna um B request ou enfim retorna qualquer outro tipo isso aí depende muito da
regra de negócio então vou colocar um return ok aqui people E se eu vier aqui e rodar minha aplicação eu já vou provavelmente adicionar e conseguir buscar isso né já dentro do meu banco de dados Então olha só que interessante eu vou vir aqui e vou adicionar uma pessoa tá Try It Out e vou colocar aqui como o João essa pessoa adicionei ó ó ele me deu aqui um retorno 200 Tá e agora eu vou vir aqui e vou simplesmente fazer o get All né da da de pessoas então eu vou vir aqui do meu
get vou dar um try out como o get ele não tem B né ele não tem parâmetro é só eu dar um Execute aqui e olha que interessante ele já me trouxe o primeiro que eu cadastrei lá né e me trouxe agora o segundo Então o meu get também Funcionou 100% e se vocês forem olhar o get ele tem o quê uma linha de código né e eu poderia simplesmente dar um um return results OK passar tudo isso aqui dentro aqui do do meu parâmetro né mas eu gosto de fazer com variáveis separadas tem muita
gente diz ah mas armazena em memória tudo bem mas se a gente for debugar enfim projetos maiores é melhor pra gente entender o que que tá acontecendo feito isso a gente pode partir pro próximo passo que é atualizar né Vamos atualizar esse cara pô eu quero trocar o nome como é que eu faço vou parar aqui minha aplicação já tenho a receita também eu vou utilizar um route ponto map dessa maneira aqui e o map ele vai ter uma diferença ele vai utilizar a rota Person aqui que a gente criou porém to Davi entretanto ele
tem que usar um parâmetro né porque para poder atualizar eu preciso saber qual que é o ID da pessoa que eu tô atualizando então o que que eu vou fazer eu vou passar aqui entre Chaves eu vou passar o parâmetro que o parâmetro vai ser o id e se não me engano eu coloquei como gid né o ID vou colocar dessa maneira aqui ID G e o que que eu preciso aqui para poder atualizar uma pessoa eu vou precisar de algumas coisas como por exemplo eu vou ter que ter um gid ID dessa maneira aqui
tá vou ter que ter esse cara eu vou ter que ter também a minha requisição por quê Porque eu preciso saber o que que eu vou alterar Qual que é o nome que eu vou ter então eu vou ter aqui um Person request requisição e também eu vou ter um Person aqui DB Contex que é o meu banco de dados eu vou só dar um enter aqui para ficar mais claro e eu vou simplesmente aqui colocar abrir o meu método aqui E logicamente né aqui a gente tá trabalhando com ayn Vamos colocar o asnc aqui
o que que vai acontecer agora pessoal o primeiro ponto que a gente tem que fazer é buscar essa pessoa que a gente tem no nosso banco de dados pelo id tá então o que que a gente vai fazer aqui para buscar isso eu vou criar uma variável chamada Person para buscar a pessoa e eu vou simplesmente utilizar um await context ponto eu não vou utilizar o fine assim agora quer dizer eu vou utilizar mas eu quero mostrar para vocês um outro método que eu gosto bastante que é o first or default aing que aqui eu
coloco quando o meu x lâmbda né o nosso querido ã Expression Body x pid for igual a o ID que eu tenho ali como a rota então isso aqui Pode parecer um pouco mais complicado Tá mas pra alegria de vocês eu também tenho um vídeo completo no canal sobre link então vou deixar ele aqui linkado também porque no link eu mostro muito dessas coisas aqui de lambda expressions e tudo mais então a gente consegue ter uma boa noção que que o first or the SY faz se por um acaso eu não ter aquele ID no
meu banco de dados ele não vai gerar uma exceção né porque por baixo dos panos eu uso por exemplo só first ayn por baixo dos panos se ele não encontra ele dá um throw New Exception né e a gente sabe o quão Custoso é uma exceção PR Nossa aplicação porém Tod vi entretanto eu posso simplesmente utilizar o meu context Desculpa o meu await await context find ayn né eu posso simplesmente utilizar esse find ayn porque o find ayn ao invés de eu passar uma instrução aqui lâ eu vou simplesmente utilizar aqui o meu meu ID
mas eu vou utilizar com o first or default tá porque eu gosto bastante de utilizar ele deixa eu só acho que até se eu Minimizar aqui né vai ser melhor porque daí a gente consegue ver por um todo Tá e agora o próximo passo é a gente tem que atualizar a pessoa mas antes de atualizar a pessoa tá Eu posso vir aqui e fazer uma verificação tá ele não vai retornar uma exceção Mas também ele não vai retornar nada pro usuário se ele não encontrar nada então o que que eu posso fazer eu posso fazer
um simples if aqui if Person igual a nulo eu vou dar um return por exemplo results results P not found dessa maneira aqui então se a pessoa for igual a nul não tem pessoa nenhuma retorno not not found depois no frontend a gente consegue tratar ó not found mostra uma mensagem amigável pro usuário Agora se ele encontrou a pessoa a gente vai partir pra atualização dela só que aqui entra um outro ponto bem interessante porque olha só eu não consigo pegar por exemplo o meu Person pname eu não consigo fazer isso aqui por quê Porque
lembra que lá dentro da nossa modelo a gente colocou que o set dela seria Private ou seja ele é inacessível então o que que eu gosto de fazer eu gosto de ter aqui dentro do meu domínio né eu gosto de ter um método por exemplo Public void Change name por exemplo tá aonde eu vou receber uma string name e esse método vai fazer o quê ele vai simplesmente atribuir o name que eu tô passando aqui para dentro do meu name vocês podem achar assim ah mas para que criar um método a mais e tudo eu
sei é um pouco complexo de entender mas isso aqui pessoal evita muito erro de desenvolvedor tá porque às vezes o desenvolvedor vai lá ah ponto nome já vou alterar quando o desenvolvedor coloca Change name ainda tem que passar um parâmetro ele sabe exatamente o que ele tá fazendo não tem como tu se enganar ai eu botei o método ali passei um parâmetro mas me enganei não tu não te enganou tu fez porque tu queria Então esse ponto aqui eu acho muito interessante porque ao invés de eu utilizar o name aqui eu vou simplesmente fazer o
seguinte vou chamar o meu Change name e passar o quê passar o meu request pname dessa maneira aqui então dessa maneira aqui eu já tô dizendo olha ao alter o nome lá atribui o nome novo que eu tenho no meu usuário e logicamente né eu tenho que vir aqui e dar um await context save Change assink né da mesma forma que quando a gente adicionou porque esse é o nosso commit e aqui eu posso retornar né O que o que foi feito né eu posso simplesmente vir aqui dar um return results e aqui eu vou
utilizar como um posso utilizar como um ok Enfim vou retornar aqui o meu Person dessa maneira aqui então Então olha só que interessante já tenho aqui o meu ele pode parecer um pouquinho mais complicado mas ele é super simples também de de de entender quando tu pega o jeito ali ele é super simples vamos colocar aqui rodar de novo e vamos ver o que que acontece Beleza então olha só o que que a gente vai fazer eu vou vir aqui dentro do meu get e vou buscar aqui todos os que eu tenho né todos os
nomes que eu tenho Então imagina que agora o João ele tem que ser um outro nome então o que que eu vou fazer eu vou pegar o ID dele para passar ali no meu request e eu vou alterar ele eu vou vir aqui no meu personal ID pode ver que como eu já tenho aqui uma rota que recebe um ID eu tenho que passar o ID ele já me dá aqui esse parâmetro aqui de ID então o que que eu vou fazer eu vou dar um try out vou colar o meu ID aqui que eu
quero mudar e qual que vai ser o novo nome que eu quero mudar ali qual que vai ser o novo nome do João eu vou colocar aqui que vai ser Carlos tá e quando eu der um Execute ele já vai retornar 200 tá E vai retornar o objeto com o nome Carlos então repara que é o mesmo ID tá se vocês vierem aqui na minha requisição ó ele é o EA né E aqui também ele Manteve o id e se eu vier aqui por exemplo no meu get vamos buscar todos eles aqui olha que interessante
ele já vai me trazer aqui como Carlos perfeito a gente fez uma atualização de forma muito eficaz só que qual que é a questão Às vezes a gente pode usar Patch né a diferença do pch e do patch é que o Patch a gente não precisa alterar o objeto todo Então imagina que eu tenho um objeto com 15 propriedades mas eu quero alterar uma propriedade só no pch tu tem que passar o objeto todo por completo tu tem que fazer esse map do objeto por completo no pet não no pet eu posso passar o o
objeto somente com aquela propriedade que eu quero alterar Então isso é bem interessante vamos fazer agora o nosso último aqui do do crud deixa deixa eu até ver se é o último Então a gente tem aqui ó deixa eu parar minha aplicação a gente tem aqui o p get vamos fazer agora o delete né que o delete Aqui tem uma coisa bem bem legal então eu eu só quero mostrar para vocês aqui eu vou utilizar um route pon delete dessa maneira map delete tá ele vai utilizar da mesma forma eu tenho que passar um ID
para poder deletar ele tá então aqui eu vou passar na rota dele vou passar um ID que ele vai ser um guid tá e o que que eu priso para fazer o delete eu vou precisar aqui por exemplo ter a minha requisição Então vou colocar aqui ó Person request dessa maneira aqui Person request que vai ser a minha requisição e eu também deixa eu só colocar aqui hack e eu também vou ter que ter o meu Person contact que vai ser o meu contexto tá e o que que acontece como eu tô utilizando o ID
aqui eu também tem que ter um gid né que vai ser o meu ID para fazer esse parâmetro de Rota e aqui também vou dar enter aqui e vou utilizar o ayn aqui que é aquela fórmula aqui que a gente já viu por exemplo no map P só que qual que é a questão tá aqui a gente entra em dois conceitos muito interessantes e eu vou mostrar um para vocês que é o mais utilizado tá a gente não modelou a nossa estrutura aqui para poder fazer esse delite de uma forma mais elegante mas eu vou
mostrar para vocês de uma maneira assim que fica digamos assim mais didática a gente tem dois tipos de delite basicamente tá a gente tem um delite que a gente chama de hard delete que é exclui a linha do banco já era né como se tu fosse lá um delete front tal tabela tá E também a gente tem o soft delete que o soft delete é o seguinte Olha eu quero manter o histórico eu não quero tirar aquela linha por completo Então a gente tem uma Flag com que é um um uma opção checkbox de True
ou false que a gente pode dizer ele tá ativo não então seta como false ele tá ele tá ativo sim então seta como true Eu gosto muito de utilizar o soft delete e vejo assim ó que na maioria dos casos a galera tá utilizando soft delete porque é muito mais elegante só que como aqui dentro da minha Person Model eu não tenho aqui uma opção de ativo eu tenho só nome e ID eu vou mudar o nome para desativado então quando for desativado né quando eu quiser desativar ele muda o nome para desativada então voltando
aqui no meu Person routes que que eu vou fazer eu vou simplesmente aqui o bom e velho CRL ctrl v né porque eu vou ter que buscar essa pessoa tá Eu vou depois que buscar a pessoa cont CRL ctrl v novamente Olha que beleza então eu vou vir aqui cont control c cont contrl V se a pessoa não foi encontrada enfim ele vai dar um return not found vou mudar o nome da pessoa tá vou mudar o nome da pessoa aqui com vai ser o meu aqui deixa eu colocar em letra minúscula né vai ser
o meu hack pname dessa maneira aqui e depois vou vou utilizar o meu save Change ayn só que dessa maneira aqui eu vou também retornar o meu por Olha só basicamente gente é o mesmo método daí vocês vão dizer Claro tá alterando o nome eu sei mas aqui ao invés de alterar o nome eu poderia ter um outro método dizendo assim ó Public void set inactive por exemplo tá intive tá até vou fazer isso tá Porque daí a gente pode simplesmente ter um método diferente e eu vou dizer que o nome aqui ele vai ser
como desativado posso fazer assim tá E olha só que interessante desativado Ah seria desativado seria como se eu botasse um True or ou false aqui tá Então olha só que legal que a gente tem Tá o que que acontece como eu já tô dizendo aqui que ele vai ser desativado quando eu venho aqui no meu Person no meu Person route tá essa minha requisição eu não preciso mais concordam porque eu não preciso setar o nome ou não preciso mandar o nome o meu nome já vai ser desativado e aqui ao invés de Change name eu
vou chamar aqui como set inactive E com isso aqui também cometi um erro tá ele não precisa ter essa string name né logicamente porque eu já tô setando aqui com isso eu vou ter o meu set negative aqui o meu setar inativo e daí vou ter o meu o meu comit e depois vou retornar essa pessoa então vamos tentar fazer isso vamos vamos rodar aqui a aplicação e aqui agora vamos fazer o seguinte eu vou vir aqui no meu get vou buscar todos Olha só que interessante busquei todos aqui e eu quero que o Henrique
aqui seja Inativo tá esse nome aqui ele não tem que constar mais no meu banco de dados que que eu vou fazer eu vou pegar o ID do Henrique aqui vou manter só o do Carlos tá E com isso eu vou vir aqui no meu delete vou dar um try out vou colocar o id que eu quero aqui e vou dar um Execute Se eu der um Execute Olha só ele Manteve aqui o meu ID e deu como desativado agora se eu vier aqui e buscar o nome buscar a pessoa ó vou de novo aqui
ele já vai mudar aqui ó ele vai simplesmente dizer que tá desativado e que o Carlos aqui permanece na lista Então olha só que legal galera a gente conseguiu criar um crude aqui bem completo Claro que tem várias outras coisas assim que a gente pode utilizar né uma coisa que a gente utiliza muito aqui por exemplo no nas rotas é utilizar o cancellation token né a gente pode C aqui né E daí quando quando eu for chamar lá o meu o meu método eu posso simplesmente colocar aqui o cancellation token também posso passar ele por
que que a gente usa cancellation token porque se por um acaso der qualquer problema no banco de dados né ou melhor na aplicação a aplicação deu Crash enfim quebrou alguma uma coisa o banco de dados ele não fica em loop né porque o banco de dados ele funciona a parte né então eu mando uma requisição pô foi lá tá buscando no banco Mas vamos supor que o usuário cancelou a requisição de alguma maneira o banco não vai ficar rodando então isso também é uma boa prática ali né que a gente pode utilizar mas em grosso
modo assim a gente conseguiu criar o nosso crw Olha só como é ficou a nossa estrutura ficou uma estrutura básica mas uma estrutura bem prática digamos assim pra gente poder estudar em casa a gente pode até apresentar isso uma entrevista de alguma coisa mostrar que a gente sabe fazer um crude novamente tem outras técnicas aqui que a gente pode fazer Talvez uma parte dois sobre crude Ou a gente pode simplesmente fazer uma parte dois mostrando como é que funciona essa estrutura em controllers mas a gente viu que é possível criar um crude esse vídeo logicamente
ficou um pouco mais longo né E como eu falei não vai ser um vídeo que vai ter tantos cortes assim mas a gente conseguiu chegar num resultado bacana eu vou deixar esse código aqui lá no meu github então para vocês poderem clonar enfim mas eu sugiro que vocês façam ele do zero vocês viram que é muito simples aqui e eu também espero de coração galera que vocês tenham gostado desse formato de vídeo é por isso que eu te peço para tu deixar aqui nos comentários se tu gostou realmente desse formato de vídeo se a gente
pode continuar tem muita coisa bacana que a gente pode fazer do início ao fim nessa jornada do herói que eu acho bem bacana Espero de coração que tu tenha gostado muito obrigado por ter ficado comigo aqui até o final do vídeo eu te vejo no próximo bons códigos e até mais