Iniciando com Entity Framework Core

rafaeldias97

Rafael Dias

Posted on January 26, 2020

Iniciando com Entity Framework Core

Olá pessoal, este artigo está sendo feito para quem estiver com o intuito de iniciar no EF Core e não faz ideia por onde começar. Deste modo, não estarei trazendo a melhor estrutura e nem me preocupando com boas práticas por questões didáticas. Contudo, o artigo tem a intenção de explicar de forma clara e objetiva sobre o EF Core, assim iniciaremos o projeto.

O que seria o Entity Framework Core? onde habita? o que faz ?. O Entity Framework Core é um dos muitos ORMs (Object-Relational Mapping) que do português seria (Mapeador Objeto Relacional), ele consegue mapear as propriedades da suas entidades em tableas do banco de dados. Com isto, ele aumenta absurdamente a produtividade de seu projeto, o codigo fica bem mais legivel e padronizado trazendo muitos beneficios na manutenção.

Configuração

O ambiente de desenvolvimento está configurado com as seguintes ferramentas:

Com tudo instalado e configurado, está na hora de iniciar o projeto.

Iniciando o Projeto

Escolha uma pasta de sua preferência, eu estarei criando uma pasta chamada EFConsole

Abra o terminal e execute o seguinte comando:

mkdir EFConsole

Navegando até a pasta do projeto:

cd EFConsole

Para este tutorial, estaremos usando uma aplicação console simples.
Para isto, rode o comando:

dotnet new console

Abra o projeto com seu editor favorito, eu estarei usando o Visual Studio code.

code .

Iniciando a Base de Dados

Para o bando de dados estaremos utilizando o Microsoft SQLServer dentro de um container docker.
Na raiz do projeto, crie um arquivo chamado docker-compose.yml:

version: "3"
services:
    db:
        image: microsoft/mssql-server-linux:latest
        container_name: db
        restart: "always"
        ports:
          - "1433:1433"
        environment:
          - ACCEPT_EULA=Y
          - SA_PASSWORD=sa@12345

Vamos iniciar o banco usando o comando:

docker-compose up -d

Com o docker iniciado, abra o Azure Data Studio e conecte com o Server=localhost, User name=sa e senha sa@12345:

Codigo e Dependências

Para trabalhar com EF Core, devemos ter 4 dependências instaladas:

dotnet add package Microsoft.EntityFrameworkCore.SqlServer

dotnet add package Microsoft.EntityFrameworkCore.Design

dotnet add package Microsoft.EntityFrameworkCore.Tools --version 3.1.1

dotnet tool install --global dotnet-ef

Codigo

Com as dependencias instaladas, vamos ao codigo, a primeira classe que iremos desenvolver é a Entidade Pessoa, onde terá os atributos (id, nome e idade):

Models/Pessoa.cs

namespace EFConsole 
{
    public class Pessoa
    {
        public int id { get; set; }
        public string nome { get; set; }
        public int idade { get; set; }
    }
}

Para a manipulação de dados, vamos criar um arquivo chamado MSSQLContext, onde através dessa classe iremos realizar o processo de Migration:

using Microsoft.EntityFrameworkCore;

namespace EFConsole {
    public class MSSQLContext : DbContext
    {
        public DbSet<Pessoa> Pessoa { get; set; }

        // Método de configuração
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
        {
            // String de conexão
            optionsBuilder
                .UseSqlServer(@"Server=localhost;Database=dbmodel;User Id=sa;Password=sa@12345;");
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder) 
        {
            modelBuilder.Entity<Pessoa>(p => {
                // Tabela
                p.ToTable("pessoa");

                p
                    .Property(v => v.nome)
                    .HasColumnType("varchar(50)");

                // Chave Primaria
                p.HasKey(k => k.id);
            });
        }
    }
}

dotnet ef migrations add Pessoa

dotnet ef database update

Ao realizar a migration, será criado uma tabela chamada "Pessoa", com os campos (id, nome e idade), para consultar no Azure Data Studio, execute o seguinte comando SQL:

USE dbmodel
GO
    SELECT * FROM pessoa

Após isto, se as colunas forem listadas, vamos criar os metodos de CRUD.

Cadastrando uma Pessoa

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;

namespace EFConsole
{
    public class Program
    {
        // Instancia Context
        MSSQLContext db = new MSSQLContext();
        // Context da Entidade Pessoa
        DbSet<Pessoa> pessoaCtx;
        public Program()
        {
            pessoaCtx = db.Set<Pessoa>();
        }
        static void Main(string[] args)
        {
            var p = new Program();
            /// Cadastrar Pessoa
             p.CadastrarPessoa(new Pessoa {
                 nome = "Rafael",
                 idade = 22
             });
        }
        // Metodo de cadastro de Pessoa
        public Pessoa CadastrarPessoa (Pessoa p)
        {
            pessoaCtx.AddAsync(p);
            db.SaveChanges();
            return p;
        }

    }
}

Consultando uma lista de pessoas

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;

namespace EFConsole
{
    public class Program
    {
        // Instancia Context
        MSSQLContext db = new MSSQLContext();
        // Context da Entidade Pessoa
        DbSet<Pessoa> pessoaCtx;
        public Program()
        {
            pessoaCtx = db.Set<Pessoa>();
        }
        static void Main(string[] args)
        {
            var p = new Program();
            .
            .
            .
            /// Consultar Pessoas
             var pessoas = p.ConsultarPessoa(new Pessoa {
                 nome = "Rafael",
                 idade = 22
             });
             pessoas.ToList().ForEach((el) => {
                 Console.WriteLine($"Id: {el.id}, Nome: {el.nome}, Idade: {el.idade}");
             });
            .
            .
            .
        }
        // Metodo de consulta de Pessoas
        public IEnumerable<Pessoa> ConsultarPessoa (Pessoa p)
        {
            var res = pessoaCtx.ToList();
            return res;
        }

    }
}

Editar uma pessoa

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;

namespace EFConsole
{
    public class Program
    {
        // Instancia Context
        MSSQLContext db = new MSSQLContext();
        // Context da Entidade Pessoa
        DbSet<Pessoa> pessoaCtx;
        public Program()
        {
            pessoaCtx = db.Set<Pessoa>();
        }
        static void Main(string[] args)
        {
            var p = new Program();
            .
            .
            .
            /// Consultar Pessoas
            p.EditarPessoa(new Pessoa {
                id = 1,
                nome = "Rafael Dias",
                idade = 22
            });
            .
            .
            .
        }
        .
        .
        .
        // Metodo de edição de Pessoas
        public Pessoa EditarPessoa (Pessoa p)
        {
            pessoaCtx.Update(p);
            db.SaveChanges();
            return p;
        }
    }
}

Deletar uma pessoa

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;

namespace EFConsole
{
    public class Program
    {
        // Instancia Context
        MSSQLContext db = new MSSQLContext();
        // Context da Entidade Pessoa
        DbSet<Pessoa> pessoaCtx;
        public Program()
        {
            pessoaCtx = db.Set<Pessoa>();
        }
        static void Main(string[] args)
        {
            var p = new Program();
            .
            .
            .
            /// Deletar Pessoa
            p.DeletarPessoa(new Pessoa {
                id = 1
            });
            .
            .
            .
        }
        .
        .
        .
        // Metodo de deleção de Pessoas
        public Pessoa DeletarPessoa (Pessoa p)
        {
            pessoaCtx.RemoveRange(p);
            db.SaveChanges();
            return p;
        }
    }
}

A classe Program.cs fica assim:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;

namespace EFConsole
{
    public class Program
    {
        MSSQLContext db = new MSSQLContext();
        DbSet<Pessoa> pessoaCtx;
        public Program()
        {
            pessoaCtx = db.Set<Pessoa>();
        }
        static void Main(string[] args)
        {
            var p = new Program();
            /// Cadastrar Pessoa
            p.CadastrarPessoa(new Pessoa {
                nome = "Rafael",
                idade = 22
            });

            /// Consultar Pessoa
            var pessoas = p.ConsultarPessoa(new Pessoa {
                nome = "Rafael",
                idade = 22
            });
            pessoas.ToList().ForEach((el) => {
                Console.WriteLine($"Id: {el.id}, Nome: {el.nome}, Idade: {el.idade}");
            });

            /// Editar Pessoa
            p.EditarPessoa(new Pessoa {
                id = 1,
                nome = "Rafael Dias",
                idade = 22
            });

            /// Excluir Pessoa
            p.DeletarPessoa(new Pessoa {
                id = 1
            });
        }

        public Pessoa CadastrarPessoa (Pessoa p)
        {
            pessoaCtx.AddAsync(p);
            db.SaveChanges();
            return p;
        }

        public Pessoa DeletarPessoa (Pessoa p)
        {
            pessoaCtx.RemoveRange(p);
            db.SaveChanges();
            return p;
        }

        public IEnumerable<Pessoa> ConsultarPessoa (Pessoa p)
        {
            var res = pessoaCtx.ToList();
            return res;
        }

        public Pessoa EditarPessoa (Pessoa p)
        {
            pessoaCtx.Update(p);
            db.SaveChanges();
            return p;
        }
    }
}

Para realizar os testes, basta descomentar as chamadas dos metodos.

Download do Projeto GitHub

💖 💪 🙅 🚩
rafaeldias97
Rafael Dias

Posted on January 26, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Iniciando com Entity Framework Core
dotnetcore Iniciando com Entity Framework Core

January 26, 2020