<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rodrigo Vaz</title>
    <description>The latest articles on DEV Community by Rodrigo Vaz (@drigovz).</description>
    <link>https://dev.to/drigovz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F185105%2F00ef8a9e-848c-45e4-a574-dbba23f656b3.jpg</url>
      <title>DEV Community: Rodrigo Vaz</title>
      <link>https://dev.to/drigovz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/drigovz"/>
    <language>en</language>
    <item>
      <title>Instalação e configuração do Docker no Ubuntu</title>
      <dc:creator>Rodrigo Vaz</dc:creator>
      <pubDate>Tue, 27 Feb 2024 22:51:15 +0000</pubDate>
      <link>https://dev.to/drigovz/instalacao-e-configuracao-do-docker-no-ubuntu-30fk</link>
      <guid>https://dev.to/drigovz/instalacao-e-configuracao-do-docker-no-ubuntu-30fk</guid>
      <description>&lt;p&gt;Fala galerinha, tudo bem ?! Drigo trazendo aqui para vocês mais um guia com dicas de programação e tecnologia. &lt;/p&gt;

&lt;p&gt;No post de hoje, vou mostrar a instalação e configuração no GNU/Linux Ubuntu de uma ferramenta que utilizo bastante em meus projetos pessoais&lt;br&gt;
e no trabalho. É ele mesmo rapaziada, o Docker.&lt;/p&gt;

&lt;p&gt;Para instalar essa ferramenta no Docker, geralmente utilizo o comando abaixo para realizar a remoção de possíveis versões anteriores, caso tenha instalado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get remove docker docker-engine docker.io containerd runc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso nós temos nosso sistema "limpo" de alguma possível instalação existente do Docker. Agora, podemos instalar os pacotes necessários para permitir o uso de um repositório com o protocolo HTTPS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get install \  
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso devemos realizar a instalação da chave GPG do repositório do Docker utilizando o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que para instalar a chave GPG, utilizamos o &lt;strong&gt;curl&lt;/strong&gt;. "Mas e se eu não tiver o curl instalado em meus sistema?? E agora?? Cheguei aqui por nada??" 😨😨&lt;/p&gt;

&lt;p&gt;Calma jovem! eu tenho a solução pra isso, execute o comando abaixo e depois tente novamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get install curl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após isso, vamos adicionar o repositório do Docker em nosso glorioso Ubuntu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora rode aquele &lt;strong&gt;apt-get update bonito&lt;/strong&gt;, pra atualizar os seus repositórios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E agora? Bem, agora nós devemos instalar o Docker propriamente dito em nossa máquina:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get install docker-ce docker-ce-cli containerd.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como sei se o Docker está instalado corretamente em minha máquina?? Podemos rodar o comando abaixo para verificar a versão do Docker que está instalada em nossa máquina:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E se tudo estiver 100% correto, o número da versão será retornado. Ou, como alternativa ao comando acima podemos também rodar o tradicional &lt;strong&gt;Hello World!&lt;/strong&gt; (sim, o Docker também tem um Hello World), da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo docker run hello-world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Possíveis erros de permissão de grupo
&lt;/h2&gt;

&lt;p&gt;Caso você receba o erro abaixo ao tentar rodar os comandos do Docker:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.24/networks/create: dial unix /var/run/docker.sock: connect: permission denied&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tente rodar o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo chmod 666 /var/run/docker.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando irá utilizar o &lt;strong&gt;chmod&lt;/strong&gt; que é a abreviatura do modo de alteração do Linux para poder tornar um arquivo executável para que em todos os usuários ele possua permissão de leitura e escrita. &lt;/p&gt;

&lt;h2&gt;
  
  
  Pós instalação do Docker
&lt;/h2&gt;

&lt;p&gt;Quando instalamos o Docker no Ubuntu, ele cria um grupo chamado docker nos grupos do sistema. Esse grupo possui as permissões para execução dos comandos e processos do Docker.&lt;/p&gt;

&lt;p&gt;A partir disso, é necessário incluir o nosso usuário do sistema (usuário que estamos utilizando no momento) nesse grupo criado para o Docker. Faremos isso para que possamos rodar e instalar contêineres e comandos do Docker de forma natural, sem recebermos erros de permissão ou bloqueios por parte do Linux.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo usermod -aG docker ${USER}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após rodarmos esse comando, é altamente recomendável que façamos o logout e login novamente no sistema para que as permissões sejam recarregadas e atualizadas.&lt;/p&gt;

&lt;p&gt;Bom galerinha, a respeito da instalação e configuração do Docker no Ubuntu eram esses pontos que eu tinha para passar para vocês. Agradeço demais por ter lido até aqui e por estar acompanhando o meu trabalho, com esses agradecimentos me despeço de vocês e bora pra cima!!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>VAR, CONST, LET e Escopo de variáveis</title>
      <dc:creator>Rodrigo Vaz</dc:creator>
      <pubDate>Tue, 14 Mar 2023 00:17:39 +0000</pubDate>
      <link>https://dev.to/drigovz/var-const-let-e-escopo-de-variaveis-2ohe</link>
      <guid>https://dev.to/drigovz/var-const-let-e-escopo-de-variaveis-2ohe</guid>
      <description>&lt;h1&gt;
  
  
  VAR, CONST, LET e Escopo de variáveis
&lt;/h1&gt;

&lt;p&gt;Com a introdução do ECMAScript 6 (ES6) duas novas maneiras de declarar uma variável apareceram em Javascript, são elas: const e let.&lt;/p&gt;

&lt;p&gt;Javascript é uma das linguagens mais utilizadas no mundo atualmente e sem dúvidas é uma linguagem poderosa e em constante evolução e melhoria. É praticamente impossível (pra não dizer impossível) programar para a web sem utilizar Javascript, se você é desenvolvedor web assim como eu, sabe disso. Por esse motivo, no artigo a seguir (o primeiro que escrevo por sinal) resolvi contar um pouco do que sei sobre as declarações de variáveis em Javascript.&lt;/p&gt;

&lt;p&gt;Abaixo cito as diferenças entre as declarações de variáveis utilizando Var, Let e Const e também o que vem a ser Escopo Global.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;VAR&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Variáveis declaradas com o var &lt;em&gt;&lt;strong&gt;tem o seu valor vazado do escopo no qual são definidas&lt;/strong&gt;&lt;/em&gt;, isso quer dizer basicamente que se você declarar uma variável como var dentro de um if por exemplo, essa variável será acessível fora dele, mesmo que tenha o seu valor como undefined. Isso acontece por conta do hoisting, que faz com que a variável seja jogada para o topo do código, e por estar declarada dentro de um bloco, o seu valor não poder ser atribuído, gerando assim um valor de saída como &lt;em&gt;undefined&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Se declararmos uma variável com var dentro de uma função ou de um bloco, o valor dessa variável não poderá ser acessada de fora dessa função ou desse bloco. Porém, se declararmos uma variável com var e tentarmos acessá-la de dentro de uma função ou de um bloco, aí sim isso será possível, bem como re-declarar uma variável com mesmo nome e mesmo valor, a última a ser escrita sobrescreve o valor da primeira, e isso é péssimo.&lt;/p&gt;

&lt;p&gt;Exemplo de reescrita de valor:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7rc6kkk99ozpfsk3zckr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7rc6kkk99ozpfsk3zckr.png" alt="Image description" width="800" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A saída será &lt;em&gt;‘Outro nome’&lt;/em&gt;, isso porque o Javascript sobrescreve a variável existente. Abaixo temos um exemplo de uma variável declarada com var podendo ser acessada de dentro de uma função:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9dtrpezcz6v2xgjs1ght.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9dtrpezcz6v2xgjs1ght.png" alt="Image description" width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Porém, se declaramos uma variável com var dentro de uma função, e tentarmos acessar a mesma de fora dessa função, teremos um erro do tipo &lt;em&gt;“is not defined”&lt;/em&gt;, ou seja, para o Javascript, essa variável não existe fora do escopo de onde ela foi declarada. No exemplo abaixo o seu escopo está apenas dentro da função:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faydwp9p207q5bd1wznd3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faydwp9p207q5bd1wznd3.png" alt="Image description" width="800" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outro exemplo de vazamento de valor de variáveis declaradas com var é quando executamos um loop e para controlar esse loop utilizamos uma variável de iteração com o var, o resultado disso é que o valor da variável de iteração poderá ser acessado de fora do loop, e isso pode causar problemas com esse valor vazado, porque se você declarar outra variável com o nome i e fizer alguma operação matemática com ela, esse valor adquirido no loop irá junto, além de ser algo indicado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9e4o0mei2990n0t8eow.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9e4o0mei2990n0t8eow.png" alt="Image description" width="800" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por isso o ideal é que seja utilizado o let como variável de iteração, porque ao rodar o mesmo código acima, trocando o var pelo let, percebemos que o valor da variável de iteração já não pode mais ser acessado de fora do loop.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;CONST&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O const, é recomendado para ser utilizado em constantes, ou seja, variável que geralmente não terão o seu valor alterado, sendo assim elas são constantes. O const irá manter o seu escopo de bloco, ou seja, se uma const for declarado dentro de uma função, por exemplo, o seu valor será acessado e utilizado apenas dentro dessa função. Outro ponto forte do const é que ele impede a re-declaração de valores, por exemplo, se declararmos uma constante com o nome preço e tentarmos re-declarar o seu valor, teremos um erro:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2lc7udshw24f09fc5t4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2lc7udshw24f09fc5t4.png" alt="Image description" width="800" height="138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O erro acima acontece na parte de atribuição de valores do Javascript, quando ele tenta atribuir um novo valor a uma constante que já possui um valor atribuído. Outro exemplo de bug que a utilização do const ajuda a evitar é como o exemplo abaixo, onde tentamos declarar uma constante com o mesmo nome duas vezes, se fizermos isso, o Javascript vai nos mostrar um erro indicando que não é possível possuir duas constantes com o mesmo nome:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftd8b4rltybbp8de66ogj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftd8b4rltybbp8de66ogj.png" alt="Image description" width="800" height="159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O erro acima é apontado na parte de execução do Javascript. Mais precisamente na parte do hoisting. Que é quando ele joga todas as variáveis para cima e começa a executar o código sequencialmente, porque no momento do hoisting ele vai perceber que estamos tentando declarar duas vezes uma constante com mesmo nome e vai acusar um erro.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;LET&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Já o let também funciona com o seu escopo de bloco, ele impede re-declaração de duas variáveis let com o mesmo nome, e permite modificação no seu valor. Então o código abaixo que daria erro utilizando const, se executarmos ele utilizando let, não teremos erro:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvayi9rf1ccngd38wp94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvayi9rf1ccngd38wp94.png" alt="Image description" width="800" height="159"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;ESCOPO GLOBAL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No Javascript uma variável que for declarada sem um dos declaradores &lt;em&gt;(var, const ou let)&lt;/em&gt; será uma &lt;em&gt;variável global que poderá ser acessada de qualquer parte do código&lt;/em&gt;, isso deve ser evitado para que erros não aconteçam, existe até uma expressão utilizada para que o Javascript passe a acusar um erro caso esse tipo de declaração seja feita, essa expressão é o &lt;strong&gt;‘use strict’&lt;/strong&gt;, com isso o Javascript vai entrar em seu modo estrito, e vai fazer com que a leitura do código seja mais rigorosa, ou seja, estamos forçando o JS a ser mais rigoroso quanto declarações de variáveis e sintaxe.&lt;/p&gt;

&lt;p&gt;Se tentarmos executar o código abaixo sem o uso do ‘use strict’, o JS vai executar o código normalmente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhw7n93kwxzdtkw9p899p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhw7n93kwxzdtkw9p899p.png" alt="Image description" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Porém basta que usemos o ‘use strict’ e se executarmos o código acima novamente, o Javascript que agora está mais cauteloso, nos dará um erro de declaração de variável.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fotwhtbgfsz6puzfklvdq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fotwhtbgfsz6puzfklvdq.png" alt="Image description" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bem pessoal, por hoje é isso. Esse é o primeiro artigo que publico no Medium e na vida (tirando os artigos acadêmicos of course!), peço que me perdoem por algo que não foi dito acima ou algo que não ficou claro, mas como esse é o primeiro de muitos, estou feliz e ansioso de certa forma. Espero que o que escrevi acima ajude você que leu até o fim. Aliás, pra você que leu até o fim, deixo aqui o meu muito obrigado!!!&lt;/p&gt;

</description>
      <category>learning</category>
      <category>career</category>
    </item>
    <item>
      <title>Entity Framework Core - Chave primária composta</title>
      <dc:creator>Rodrigo Vaz</dc:creator>
      <pubDate>Thu, 15 Jul 2021 00:15:36 +0000</pubDate>
      <link>https://dev.to/drigovz/entity-framework-core-chave-primaria-composta-5cbg</link>
      <guid>https://dev.to/drigovz/entity-framework-core-chave-primaria-composta-5cbg</guid>
      <description>&lt;h2&gt;
  
  
  Um pouco sobre o Entity Framework Core
&lt;/h2&gt;

&lt;p&gt;O Entity Framework Core é uma ferramenta ORM (Object-Relational Mapper) que mapeia objetos expostos em classes C# para entidades de um banco de dados. O Entity Framework Core dá suporte a consultas por meio do LINQ, controla as alterações nas entidades, atualizações e migrations (migrações) de schemas (esquemas) de banco de dados.&lt;/p&gt;

&lt;p&gt;O Entity Framework está disponível a partir do Service Pack do .NET Framework em sua versão 3.5, no Visual Studio 2008. Desde então, vem ganhando várias atualizações e melhorias e tem se consolidado como principal ferramenta ORM para desenvolvimento de aplicações na plataforma .NET. Com a chegada do .NET Core, o Entity Framework naturalmente evoluiu para o Entity Framework Core (EF Core), recebendo diversas melhorias, e como esperado, tornou-se, assim como o .NET Framework, multiplataforma. Estando disponível para Windows, MacOS e GNU/Linux.&lt;/p&gt;

&lt;p&gt;Você pode conferir todas as informações e documentação do Entity Framework Core no site oficial da ferramenta, através do link: &lt;a href="https://docs.microsoft.com/pt-br/ef/" rel="noopener noreferrer"&gt;Documentação oficial do EF Core&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é uma chave primária composta
&lt;/h2&gt;

&lt;p&gt;Uma chave primária composta é aquela criada com dois ou mais campos, ou seja, é a combinação de mais de uma coluna, e que desta maneira, passa a utilizar a junção dos dados dos dois campos indicados para compor um valor único, evitando assim o bloqueio por duplicidade. Com isso temos a garantia de que cada linha na tabela poderá ser identificada de forma única.&lt;/p&gt;

&lt;p&gt;De maneira geral, utiliza-se a chave primária composta quando não existe um campo que possa ser usado para identificar as linhas de forma exclusiva, necessitando então que se tenha uma junção de dois ou mais campos para formar uma chave composta, ou então, quando não há a necessidade de se ter uma chave primária simples em uma tabela. Como é o caso da situação abaixo. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Em um shopping são realizadas promoções, e nessas promoções são incluídos diversos produtos com um determinado desconto. Um mesmo produto pode pertencer a várias promoções diferentes, e uma única promoção obviamente poderá conter vários produtos diferentes.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para resolver esse problema, podemos criar uma tabela para produtos (&lt;strong&gt;Products&lt;/strong&gt;), uma tabela para promoções (&lt;strong&gt;Promotions&lt;/strong&gt;) e uma tabela de JOIN, para ser a tabela que irá realizar a junção das promoções com os produtos (&lt;strong&gt;PromotionsProducts&lt;/strong&gt;) conforme exemplo ilustrado no diagrama ER (&lt;em&gt;Entidade Relacionamento&lt;/em&gt;) abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0vujpc1l8hhd3tq3v9u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0vujpc1l8hhd3tq3v9u.png" alt="diagrama ER" width="690" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que na tabela PromotionProducts não possuímos nenhuma chave primária, apenas temos uma referência para o ID da tabela de produtos e uma referência para o ID da tabela de promoções. &lt;/p&gt;

&lt;p&gt;É em uma situação como essa que entra a chave primária composta. Por meio dela podemos, nesse exemplo, fazer uma chave primária composta com o ID da tabela de produtos, e o ID da tabela de promoções. Assim, cada linha dessa tabela será exclusiva, evitando duplicação. O código SQL para a criação dessa tabela está exemplificado abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9yse3mqm8t4i8ao8obxn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9yse3mqm8t4i8ao8obxn.png" alt="sql" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isso é importante porque em casos onde utilizamos ferramentas ORM, como o Entity Framework Core, por exemplo, é importante termos uma chave primária para cada entidade que iremos mapear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chave primária composta no Entity Framework Core
&lt;/h2&gt;

&lt;p&gt;Para podermos utilizar as chaves primárias compostas no Entity Framework Core, devemos adicionar uma sobrescrita ao método do próprio Entity Framework Core &lt;strong&gt;OnModelCreating&lt;/strong&gt; na classe de contexto da nossa aplicação. &lt;/p&gt;

&lt;p&gt;Esse método é executado no evento de criação do modelo da nossa aplicação. Nele, podemos fazer algumas configurações para que sempre sejam executadas antes do evento de criação do modelo começar. Podemos adicionar o seguinte código na classe de contexto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqbitoukjtkged14qwg1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqbitoukjtkged14qwg1.png" alt="context class" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dessa forma estamos indicando ao Entity Framework Core que a nossa Entidade &lt;strong&gt;PromotionProduct&lt;/strong&gt; possui uma chave primária composta pelos valores de &lt;strong&gt;PromotionID&lt;/strong&gt; e &lt;strong&gt;ProductID&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Criamos assim uma relação muitos-para-muitos, onde podemos ter a classe product indicando que um produto pode estar em muitas promoções:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi5ucve24994ihrogrw16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi5ucve24994ihrogrw16.png" alt="product" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Teremos também a nossa classe de promoções, onde nela estamos informando que possuímos muitos produtos para cada promoção:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fidmcxo8e8r8hy5vspbd0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fidmcxo8e8r8hy5vspbd0.png" alt="promotion" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E na nossa classe de JOIN teremos uma ligação de muitas promoções e muitos produtos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrk2fqlvz7j1pf93hwxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrk2fqlvz7j1pf93hwxw.png" alt="join class" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fechamos assim este artigo. Muito obrigado por ter lido até aqui.&lt;br&gt;
Até o próximo.&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>sql</category>
    </item>
  </channel>
</rss>
