» Primeiros passos com Entity Framework + MySQL em MVC
20/09/2016    C#.NET

Olá!
Nesse artigo vou falar um pouco sobre o Entity Framework, MySQL e MVC. Ou seja, vou mostrar como criar uma aplicação em MVC e trazer dados de um banco de dados MySQL utilizando Entity Framework.


Preparando a Aplicação

Vamos criar um novo projeto totalmente vazio do tipo MVC, então na janela de novo projeto do Visual Studio escolha do lado esquerdo o template Visual C# > Web e em seguida ASP.NET Web Application.
Vou dar o nome do projeto de TesteConexao. Em seguida escolha o template Empty e tipo MVC.

Como vamos trabalhar com o Entity Framework, vamos instalá-lo em nosso projeto. Para isso abra o Package Manager Console e execute o comando Install-Package EntityFramework.

Mais informações sobre este pacote: https://www.nuget.org/packages/EntityFramework.

Também iremos trabalhar com o MySQL então vamos instalá-lo também, executando no Package Manager Console o comando Install-Package MySql.Data.Entity.

Mais informações sobre este pacote: https://www.nuget.org/packages/MySql.Data.Entity/.

Agora vamos inserir no arquivo Web.config a string de conexão para o nosso banco, então abra o arquivo Web.config e insira o código abaixo substituindo os valores do banco pelo seu banco, o código abaixo precisa ser inserido dentro da tag < configuration>, eu particularmente gosto de inserir logo após o fechamento da tag < / appSettings>.

        
            < add name="ConString" connectionString="Data Source=endereco_do_seu_banco; Port=sua_porta; Database=sua_database;
                User ID=seu_usuario; Password=sua_senha;" providerName="MySql.Data.MySqlClient" />
        
        


Criando o modelo

Em nosso exemplo, criei uma tabela com o nome de 'filme', uma tabela simples com 4 campos e 5 registros conforme mostra a imagem abaixo:

O Entity Framework trabalha com objetos, então para trazermos os filmes que estão na tabela precisamos criar um modelo de registro do tipo 'Filme'.
Dentro da pasta Models crie uma classe com o nome de Filme com a seguinte estrutura:

            namespace TesteConexao.Models
            {
                public class Filme
                {
                    public int ID { get; set; }
                    public string Titulo { get; set; }
                    public string Ano { get; set; }
                    public string Categoria { get; set; }
                }
            }
        


Criando conexão com o banco de dados

O próximo passo é criarmos uma conexão com nosso banco de dados MySQL.
Vamos criar uma pasta em nosso projeto, gosto de chamar de Dal (Data Access Layer), pois vai conter todas as classes e métodos de controle de conexão com o banco. Dentro dessa pasta crie uma classe chamada BancoContexto. Nesse ponto a estrutura do nosso projeto deve estar dessa forma:

Vamos trabalhar agora com a nossa classe BancoContexto.
Inclua nela as seguintes referências:

            using System.Data.Entity;
            using System.Data.Entity.ModelConfiguration.Conventions;
            using TesteConexao.Models;
        

A classe principal, ou seja, a BancoContexto deve herdar da classe DbContext que é uma classe do Entity Framework, então altere nossa classe para ser uma filha dela:

            public class BancoContexto : DbContext
            { }
        

Agora dentro da classe BancoContexto vamos criar um atributo que herde da ConnectionString da nossa conexão, que se encontra em nosso Web.config:

            public BancoContexto() : base("ConString")
            { }
        

Ainda dentro da nossa classe BancoContexto vamos criar um DbSet que será responsável por trabalhar com os dados da nossa tabela Filme:

            public DbSet< Filme > Filme { get; set; }
        

O Entity Framework tem uma coisinha meio chata; Como nós criamos um DbSet com o nome de Filme o Entity na verdade vai procurar no banco de dados uma tabela com o nome de Filmees; Isso porque ele vai pluralizar colocando o 'es' na frente.
Para bloquear isso, inclua o codigo abaixo ainda dentro da classe BancoContexto:

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Conventions.Remove< PluralizingTableNameConvention > ();
            }
        

Agora a nossa classe BancoContexto está pronta, caso tenha ficado perdido segue abaixo a classe completa:

            using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Web;
            using System.Data.Entity;
            using System.Data.Entity.ModelConfiguration.Conventions;
            using TesteConexao.Models;

            namespace TesteConexao.Dal
            {
                public class BancoContexto : DbContext
                {
                    public BancoContexto() : base("ConString")
                    { }

                    public DbSet< Filme > Filme { get; set; }
                    
                    protected override void OnModelCreating(DbModelBuilder modelBuilder)
                    {
                        modelBuilder.Conventions.Remove< PluralizingTableNameConvention >();
                    }
                }
            }
        


Trazendo os dados do banco

Agora estamos na etapa final, vamos trazer os filmes que estão em nossa tabela.

Vamos criar um novo Controller com o nome de FilmeController. Para isso clique com o botão direito em cima da pasta Controllers > Add > Controller. Na nova janela, escolha o tipo MVC 5 Controller - Empty.

Dentro do nosso novo Controller vamos criar uma variável com o nome de _dbContext que será usada para conexão com o banco de dados:

            namespace TesteConexao.Controllers
            {
                public class FilmeController : Controller
                {
                    public BancoContexto _dbContext = new BancoContexto();
                    
                    // GET: Filme
                    public ActionResult Index()
                    {
                        return View();
                    }
                }
            }
        
Notem que após isso será mostrado um erro em nossa nova variavel, para consertar isso vamos incluir a referência de nossa classe de acesso ao banco de dados:
            using TesteConexao.Dal;
        

Dentro da classe Index vamos deixar da seguinte forma:

        // GET: Filme
        public ActionResult Index()
        {
            string sql = "select * from filme";
            var itens = _dbContext.Database.SqlQuery< Models.Filme >(sql).ToList();

            return View(itens);
        }
        
No código a cima primeiro nós criamos uma variável com o nosso SQL, em seguida criamos uma variável e executamos dentro dela o retorno da execução de nossa SQL através do Entity; Reparem que para executar nossa SQL pelo Entity nós passamos o modelo de dados e também o comando ToList() já que virão vários filmes.

Na linha de baixo, no retorno nós estamos passando a View (que ainda vamos criar) e jogando para essa view o objeto com a nossa lista de filmes.


Criando a View

Precisamos agora criar uma View para exibir os dados do nosso Controller.
Para isso vá até a ActionResult e clique com o botão direito em Index e escolha a ação Add View:

Em nossa nova View vamos no topo de tudo declarar o formato de dados que o Controller está enviando. Como em nosso Controller nós estamos pegando uma lista de filmes, então vamos declarar o formato como um IEnumerable do tipo Filme:

        @model IEnumerable< TesteConexao.Models.Filme >
        
        @{
            Layout = null;
        }

        < !DOCTYPE html >
        

O próximo passo é realizar um loop em nosso objeto e mostrar todos os registros, então dentro do body deixe da seguinte forma:

        
            
Ao compilar e executar nós temos o seguinte resultado na página:

Reparem que clicar em um filme, o link sendo aberto é /Filme/Item/1, onde Filme é o nome do nosso Controller, Item é a action do nosso controle responsável por exibir dados de somente um filme (ainda não criamos) e o número 1 é o ID do nosso filme.

Então vamos agora implementar essa Action para exibir um único filme.
Em nosse Controller, logo após o fechamento da Action Index, vamos criar outra:

            // GET: Filme/Item
            public ActionResult Item(string id)
            {
                string sql = @"select * from filme where id = "+ id;
                var itens = _dbContext.Database.SqlQuery< Models.Filme >(sql).FirstOrDefault();
                
                return View(itens);
            }
        
Repare que na execução da seleção nós utilizamos o método FirstOrDefault() e não ToList() como usamos anteriormente, pois dessa vez nós não iremos trazer uma lista e sim um único registro.

Vamos agora criar a nossa View para exibir o nosso filme selecionado. O processo é o mesmo feito anteriormente, vá até o Controller, clique com o botão direito em cima da Action Item e vá em Add View.

Na nova View, no HTML vamos também declarar na primeira linha o tipo de registro que está vindo do nosso Controller, dessa vez não vamos inserir IEnumerable pois não temos uma lista e sim um registro somente:

        @model TesteConexao.Models.Filme
        
        @{
            Layout = null;
        }
        

O body deixaremos da seguinte forma:

                
Filme escolhido:
@Model.Titulo - @Model.Ano - @Model.Categoria

Compile e execute o projeto com a página Index aberta para ela ser a primeira a ser exibida no navegador, em seguida selecione algum filme e verá nossa segunda Action em ação:


Conclusão

Está concluído! Esse mesmo método e classe que criamos para se conectar com o banco além de poder trazer dados como fizemos, também pode ser usado para realizar a inserção, alteração, atualização e exclusão de dados, porém esse assunto será tratado em outros artigos.
Disponibilizei esse projeto, ele pode ser baixado junto com seu código fonte, segue o link:
https://github.com/FabricioLeite/Example-MVC-Entity-MySQL




Comentários