Entity Framework 6 - Fundamentos - Criando um modelo conceitual (Model First para novatos)


Se você está apenas começando a explorar Entity Framework, talvez esteja pensando: "Ok, como faço para começar?" 
Se este for o seu caso, quanta coincidência; esse artigo foi escrito para você.


Se, por outro lado, você já construiu alguns modelos de trabalho e se sente confortável com alguns conceitos de modelagem, como divisão de entidades e herança, você pode ler este artigo para revisar conceitos ou simplesmente ignorá-lo.
 

O Entity Framework é uma ferramenta OR/M que realiza o mapeamento objeto relacional gerando entidades e mapeando-as para as tabelas do banco de dados.


Neste artigo, vou abordar os básicos de modelagem Model First com Entity Framework. A modelagem é a característica central do Entity Framework que o distingue das plataformas de acesso a dados anteriores da Microsoft.
 

O Entity Framework pode ser usado com o seguintes padrões de desenvolvimento:

  • Code First - Criamos classes POCO que são mapeadas para as entidades;

  • Database First - Mapeamos para um Banco de dados que já existe;

  • Model First -  Criamos o Modelo conceitual primeiro e depois é gerado o script para criar o banco de dados;


Depois de ter construído o seu modelo de entidades usando o Entity Data Model, você pode escrever código contra o modelo e não contra as linhas e colunas no banco de dados relacional como estava acostumado fazer.

Vamos começar com um exemplo de como criar um modelo conceitual simples, e então deixar o Entity Framework criar o banco de dados e as tabelas.

Para você se situar, na tabela a seguir temos uma apresentação de cada versão do Entity Framework e seus principais recursos:

Versão Principais Recursos
EF 3.5 Suporte a O/RM básico com a abordagem Database First.
EF 4.0 Suporte a POCO, Lazy loading, melhoria na testabilidade, geração de código customizada e a abordagem Model First.
EF 4.1 Disponibilizado também via pacote NuGet, API DBContext Simplificada ao invés de ObjectContext, abordagem Code First. (Correção de bugs com a versão EF 4.1.1) 
EF 4.3 Recurso Code First Migrations que permite que um banco de dados criado via Code First ser gradativamente alterado conforme o modelo Code First evoluir. Liberação da versão EF 4.3.1 para correção de bugs do EF 4.3.
EF 5.0 Anunciado EF como Open Source. Apoio a Enum Introduzido, funções com valor de tabela, tipos de dados espaciais, vários diagramas por modelo, coloração de formas na superfície de projeto e importação de lote de procedimentos armazenados, EF Power Tools e várias melhorias de desempenho.
EF 6.0/6.1 Inclui muitos novos recursos relacionadas ao Code-First e ao descritor EF como consulta e persistência assíncrona, resilência da resolução de dependências, etc

Mas não se assuste, o Entity Framework 6.0 é uma evolução, e tudo o que você já aprendeu e já conhece sobre o Entity Framework não esta perdido pois ele permanece o mesmo não havendo uma mudança radical no seu funcionamento mas apenas em alguns recursos.

Veja o site oficial do Entity Framework no Nuget : http://www.nuget.org/packages/EntityFramework

Recursos usados

Objetivos

Aprendizado

Criando o projeto no VS 2013

Abra o Visual Studio 2013 Express for Windows desktop e clique em New Project;

Selecione o template Visual Basic -> Windows Forms Application e informe o nome EF6_Fundamentos1 e clique no botão OK;

Agora vamos incluir no projeto criado uma  referência ao Entity Framework.

Na janela Solution Explorer clique com o botão direito do mouse sobre o projeto EF6_Fundamentos1 e a seguir clique em Manage Nuget Packages.

A seguir clique na guia Online e na caixa de pesquisa digite EntityFramework;

Localize o pacote para o EntityFramework e clique no botão Install, confirmando e aceitando a instalação;

Vamos imaginar que você deseja criar uma aplicação para gerenciar os nomes e números de telefone de pessoas que você conhece. Para manter as coisas simples, vamos supor que você precisa de apenas um tipo de entidade: Pessoa.

Vamos criar um  modelo de entidades que representa a nossa entidade Pessoa usando o Entity Data Model.

No menu PROJECT -> Add New Item;

Selecione o item Data e o template ADO .NET Entity Data Model, e informe o nome Fundamento1.edmx e clique no botão Add;

A seguir selecione a opção Empty Model e clique no botão Finish;

O assistente vai criar um novo modelo conceitual com um descritor vazio. Neste momento vamos alterar o nome do container, propriedade Entity Container Name, para Fundamentos;

A seguir clique com o botão direito sobre a superfície vazia do descritor e selecione : Add New -> Entity.

Na janela Add Entity faça o seguinte:

  1. Informe o nome Pessoa em Entity name,

  2. Altere o nome para Pessoas em Entity Set

  3. Marque a opção - Create key Property

  4. Define o nome Id para Property name;

  5. Defina o tipo Int32 para Property Type;

Para concluir clique no botão Ok;

Será criada a entidade Pessoa no descritor. Note que eu alterei a cor preenchimento.(A cor padrão é um tom de azul)

Note que foi gerada por padrão a propriedade escalar Id  como uma Entity Key (True) e do tipo identidade (StoredGeneratedPattern = Identity);

Esta propriedade quando definida como igual a True indica que o valor de Id será calculado pelo banco de dados e quando a tabela for gerada esse valor irá gerar uma coluna Id do tipo identity.

Clique no topo da entidade Pessoa com o botão direito do mouse e selecione Add New -> Scalar Property;

Uma nova propriedade escalar será adicionado à entidade Pessoa.

Altere o nome da propriedade para Nome e define sua propriedade Max Length como igual a 50. Repita o procedimento e inclua a propriedade Telefone com Max Length também igual a 50.

Estamos pronto para gerar o banco de dados a partir do modelo de entidades criado. Para isso clique com o botão direito do mouse sobre o descritor e no menu suspenso clique em Generate DataBase from Model.

No assistente para gerar o banco de dados será a apresentada a janela Choose Your Data Connection. Vamos clicar no botão New Connection;

Na janela para definir as propriedades da conexão devemos definir os seguintes itens:

Ao clicar em OK será apresentada uma caixa de diálogo informando que o banco de dados não existe e se deseja tentar criá-lo:

Clicando em si veremos na próxima janela a conexão exibida conforme figura abaixo. Clique então no botão Next>;

Vamos selecionar a versão do Entity Framework que vamos usar. No nosso exemplo marque a versão Entity Framework 6.0:

Será gerado o script SQL - Fundamentos1.edmx.sql - contendo os comandos SQL para criar o banco de dados e a tabela no SQL Server:

Clique em Finish e na próxima janela clique no botão - Execute. Será aberta a janela de login como o seu SQL Server. Informe suas credenciais e clique em Connect;

Após a execução do script SQL, o banco de dados EF6_Fundamentos e a tabela Pessoas contendo os campos : Id, Nome e Telefone serão criados e exibidos no DataBase Explorer:

Pronto ! concluímos a etapa da criação do banco de dados e das tabelas a partir do nosso  modelo conceitual gerado no Entity Data Model.

Criando a interface com o usuário e realizando as operações CRUD

Vamos retornar ao nosso formulário form1.vb da aplicação e partir da toolbox incluir o seguintes controles no formulário:

Disponha os controles conforme o leiaute da figura abaixo:

1- Acessando o modelo de entidades e exibindo as informações no DataGridView

Para exibir as informações no DataGridView vamos usar e evento Load que ocorre quando o formulário form1.vb é carregado e incluir nele o código abaixo:

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        carregaGrid()
    End Sub

O código da rotina carregaGrid é dado a seguir:

Private Sub carregaGrid()
        Using db = New Fundamentos
            Dim _pessoas = From p In db.Pessoas Order By p.Nome Ascending
                                Select p
            dgvPessoas.DataSource = _pessoas.ToList()
            formataGridPessoas()
        End Using
End Sub

O código esta criando uma nova instância do nosso contexto usando a cláusula Using:

   Using db = New Fundamentos

E definindo uma consulta onde iremos selecionar todas as informações da entidade Pessoas ordenadas pelo nome:

Dim _pessoas = From p In db.Pessoas Order By p.Nome Ascending
                    Select p

A seguir atribuímos o resultado da consulta ao controle DataGridView e chamamos a rotina para formatar o controle:

 dgvPessoas.DataSource = _pessoas.ToList()
 formataGridPessoas()

A rotina formataGridPessoas() possui o seguinte código:

 Private Sub formataGridPessoas()
        With dgvPessoas
             'não gera as colunas de forma automática
            .AutoGenerateColumns = False
            .RowHeadersVisible = False
             'não exibe o nome dos cabeçalhos e define a borda como simples
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
            .ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
            'altera a cor das linhas alternadas no grid
            .RowsDefaultCellStyle.BackColor = Color.White
            .AlternatingRowsDefaultCellStyle.BackColor = Color.YellowGreen
            'altera o nome das colunas
            .Columns(0).HeaderText = "Id"
            .Columns(1).HeaderText = "Nome"
            .Columns(2).HeaderText = "Telefone"
            'largura colunas
            .Columns(0).Width = 60
            .Columns(1).Width = 160
            .Columns(2).Width = 160
            'seleciona a linha inteira
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            'não permite seleção de multiplas linhas
            .MultiSelect = False
            ' exibe nulos formatados
            .DefaultCellStyle.NullValue = " - "
            'permite que o texto maior que célula não seja truncado
            .DefaultCellStyle.WrapMode = DataGridViewTriState.True
        End With
    End Sub

2- Incluindo informações de pessoa no modelo de entidades e persistindo no banco de dados

No evento Click do botão - Incluir - temos o código que permite incluir informações de nome e telefone das caixas de texto no modelo de entidades usando o método Add e em seguida persistir essas informações no banco de dados usando o método SaveChanges():

 Private Sub btnIncluir_Click(sender As Object, e As EventArgs) Handles btnIncluir.Click
        Dim pessoa As New Pessoa
        If String.IsNullOrEmpty(txtNome.Text) Or String.IsNullOrEmpty(txtTelefone.Text) Then
            MessageBox.Show("Informe o nome e o telefone")
            txtNome.Focus()
            Return
        Else
            pessoa.Nome = txtNome.Text
            pessoa.Telefone = txtTelefone.Text
        End If
        Try
            Using db = New Fundamentos
                db.Pessoas.Add(pessoa)
                db.SaveChanges()
                MessageBox.Show("Dados incluídos.")
            End Using
            carregaGrid()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

Note que você não precisa se preocupar em informar o código da pessoa pois ele foi definido como auto incremental.

3- Excluindo informações de pessoas do modelo de entidades e persistindo no banco de dados

No evento Click do botão - Excluir - temos o código que permite excluir informações de uma pessoa.

Private Sub btnExcluir_Click(sender As Object, e As EventArgs) Handles btnExcluir.Click
        Dim codigo As Integer
        If String.IsNullOrEmpty(txtId.Text) Then
            MessageBox.Show("Informe código")
            txtId.Focus()
            Return
        Else
            codigo = Convert.ToInt32(txtId.Text)
        End If
        Try
            Using db = New Fundamentos
                Dim pessoa = (From p In db.Pessoas Where p.Id = codigo).SingleOrDefault
                db.Pessoas.Remove(pessoa)
                db.SaveChanges()
                MessageBox.Show("Dados excluídos.")
            End Using
            carregaGrid()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

 

O código realiza uma pesquisa onde procurar por uma entidade pessoa cujo código seja igual ao informado na caixa de texto : txtId.

 Dim pessoa = (From p In db.Pessoas Where p.Id = codigo).SingleOrDefault

A seguir a entidade é removida do contexto:

  db.Pessoas.Remove(pessoa)

E essa informação e repassado ao banco de dados que o registro correspondente da tabela seja excluído:

   db.SaveChanges()

4- Alterando informações de pessoas do modelo de entidades e persistindo no banco de dados

No evento Click do botão - Alterar - temos o código que permite excluir informações do modelo de entidades.

    Private Sub btnAlterar_Click(sender As Object, e As EventArgs) Handles btnAlterar.Click
        Dim codigo As Integer
        If String.IsNullOrEmpty(txtId.Text) Then
            MessageBox.Show("Informe código")
            txtId.Focus()
            Return
        Else
            codigo = Convert.ToInt32(txtId.Text)
        End If
        If String.IsNullOrEmpty(txtNome.Text) Then
            MessageBox.Show("Informe o nome", "Alterar", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Return
        End If
        Try
            Using ctx As New Fundamentos
                Dim pessoa = (From p In ctx.Pessoas Where p.Id = codigo).SingleOrDefault
                If IsNothing(pessoa) Then
                    MessageBox.Show("Pessoa não localizada", "Localizar", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    Return
                End If
                pessoa.Nome = txtNome.Text
                pessoa.Telefone = txtTelefone.Text
                ctx.SaveChanges()
                MessageBox.Show("Dados alterados.")
            End Using
            carregaGrid()
        Catch ex As Exception
            MessageBox.Show("Erro " + ex.Message, "Erro::Alterar", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

O código realiza uma pesquisa onde procurar por uma entidade pessoa cujo código seja igual ao informado na caixa de texto : txtId.

   Dim pessoa = (From p In ctx.Pessoas Where p.Id = codigo).SingleOrDefault

A seguir verificamos se a entidade pessoa retornada é nula:

    If IsNothing(pessoa) Then

E caso contrário realizamos as alterações na entidade:

    pessoa.Nome = txtNome.Text
    pessoa.Telefone = txtTelefone.Text

E persistimos as informações refletindo a alteração no banco de dados:

    ctx.SaveChanges()

Executando o projeto e realizando algumas operações podemos ver a seguir o resultado obtido:

Fizemos tudo isso usando uma única ferramenta gratuita :  O Visual Studio 2013 Express for Windows desktop

Parabéns para você que acompanhou o artigo e chegou ao final.

Pegue o projeto completo:  EF6_Fundamentos1.zip (sem as referências ao EF)

João 3:19 E o julgamento é este: A luz veio ao mundo, e os homens amaram antes as trevas que a luz, porque as suas obras eram más.

João 3:20 Porque todo aquele que faz o mal aborrece a luz, e não vem para a luz, para que as suas obras não sejam reprovadas.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti