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, 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.
![]() |
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.
|
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:
Informe o nome Pessoa em Entity name,
Altere o nome para Pessoas em Entity Set
Marque a opção - Create key Property
Define o nome Id para Property name;
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:
3 Label
3 TextBox - txtId, txtNome e txtTelefone
4 Buttons - btnIncluir, btnExcluir, btnAlterar e btnSair
1 DataGridView - dgvPessoas
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: