Entity Framework 4 - Fazendo CRUD

8
26/2/2014 Entity Framework 4.1 - CRUD http://www.macoratti.net/11/09/ef4_crud1.htm 1/8 Entity Framework 4.1 - Fazendo o CRUD e nada mais Em meus últimos artigos sobre o Entity Framework eu dei ênfase ao utilização dos recursos do Code-First e da API DbContext onde a partir da definição do modelo de entidades via classes POCO eram gerados o banco de dados e as tabelas. O Entity Framework é uma ferramenta OR/M (Mapeamento Objeto Relacional) que realiza o mapeamento objeto relacional gerando entidades e mapeando-as para as tabelas do banco de dados. Com a nova versão do Entity Framework (a 4.1) podemos usar classes POCO para realizar o mapeamento objeto relacional e a persistência dos dados sem termos que ficar dependentes do Entity Data Model gerado, pois as classes POCO não herdam das classes base geradas pelo EF. Hoje vamos entender como atuam as funcionalidades CRUD (Create, Update, Delete) visto que são as mais usadas no dia dia. É muito simples realizar as operações CRUD no Entity Framework 4.1. Para entender melhor como o processo funciona você deve conhecer alguns conceitos básicos. Vamos a eles... Conceitos mais que básicos (e suficientes...) O EF 4.1 trabalha em um nível de abstração que chamamos entidades que representam os objetos do domínio da sua aplicação que foram definidos no EF. Uma entidade pode estar em um dos cinco estados abaixo definidos, tal como definido pela enumeração EntityState: Added : a entidade está sendo controlada pelo contexto, mas ainda não existe no banco de dados; Unchagned : a entidade está sendo controlada pelo contexto e existe no banco de dados e seus valores de propriedade não mudaram a partir dos valores no banco de dados; Modified: a entidade está sendo controlado pelo contexto e existe no banco de dados, e alguns ou todos os seus valores de propriedade foram modificados; Deleted : a entidade está sendo controlada pelo contexto e existe no banco de dados, mas foi marcada para exclusão no banco de dados da próxima vez que o método SaveChanges for chamado; Detached: a entidade não está sendo controlada pelo contexto; O método SaveChanges faz coisas diferentes para as entidades conforme o seu estado: Entidades inalteradas (Unchanged) não são afetadas pelo método SaveChanges. As atualizações não serão enviadas ao banco de dados para entidades no estado inalterado (unchanged); Entidades Adicionadas(Added) são inseridas no banco de dados e, em seguida, tem seu estado alterado para inalterado (Unchanged) após o retorno do método SaveChanges; Entidades modificadas(Modified) são atualizadas no banco de dados e, em seguida, tornam-se inalteradas (Unchanged) quando o método SaveChanges retorna; Entidades deletadas(Delete) são excluídas do banco de dados e então são separadas (Detached) do contexto; Quem gerencia o estado de um entidade é o Object Context que representa o entity container definido em um modelo conceitual e contém a conexão correspondente à fonte de dados e fornece serviços como o gerenciamento de estado e resolução de identidade. Um object context é representado por uma instância da classe ObjectContext. Objetivo O objetivo deste artigo é mostrar de forma simples e descomplicada como realizar as operações CRUD no Entity Framework 4.1 Em resumo iremos realizar as seguintes tarefas: Definir entity data model com base em um modelo conceitual; Referenciar o assembly Entity Framework (EF); Gerar os scripts para criação do banco de dados e tabelas Realizar as operações CRUD na tabela criada; Recursos Os recursos necessários para acompanhar o artigo são: Entity Framework 4.1 Microsoft SQL Server 2008: Express Visual Web Developer 2010 Express | Microsoft Visual Studio

Transcript of Entity Framework 4 - Fazendo CRUD

Page 1: Entity Framework 4 - Fazendo CRUD

26/2/2014 Entity Framework 4.1 - CRUD

http://www.macoratti.net/11/09/ef4_crud1.htm 1/8

Entity Framework 4.1 - Fazendo o CRUD e nada mais

Em meus últimos artigos sobre o Entity Framework eu dei ênfase ao utilização dos recursos do Code-First e da API DbContext onde

a partir da definição do modelo de entidades via classes POCO eram gerados o banco de dados e as tabelas.

O Entity Framework é uma ferramenta OR/M (Mapeamento Objeto Relacional) que realiza o mapeamento objeto relacional gerando

entidades e mapeando-as para as tabelas do banco de dados.

Com a nova versão do Entity Framework (a 4.1) podemos usar classes POCO para realizar o mapeamento objeto relacional e a persistência dos

dados sem termos que ficar dependentes do Entity Data Model gerado, pois as classes POCO não herdam das classes base geradas pelo EF.

Hoje vamos entender como atuam as funcionalidades CRUD (Create, Update, Delete) visto que são as mais usadas no dia dia.

É muito simples realizar as operações CRUD no Entity Framework 4.1. Para entender melhor como o processo funciona você deve

conhecer alguns conceitos básicos.

Vamos a eles...

Conceitos mais que básicos (e suficientes...)

O EF 4.1 trabalha em um nível de abstração que chamamos entidades que representam os objetos do domínio da sua aplicação que

foram definidos no EF.

Uma entidade pode estar em um dos cinco estados abaixo definidos, tal como definido pela enumeração EntityState:

Added : a entidade está sendo controlada pelo contexto, mas ainda não existe no banco de dados;

Unchagned : a entidade está sendo controlada pelo contexto e existe no banco de dados e seus valores de propriedade não

mudaram a partir dos valores no banco de dados;

Modified: a entidade está sendo controlado pelo contexto e existe no banco de dados, e alguns ou todos os seus valores de

propriedade foram modificados;

Deleted : a entidade está sendo controlada pelo contexto e existe no banco de dados, mas foi marcada para exclusão no banco

de dados da próxima vez que o método SaveChanges for chamado;

Detached: a entidade não está sendo controlada pelo contexto;

O método SaveChanges faz coisas diferentes para as entidades conforme o seu estado:

Entidades inalteradas (Unchanged) não são afetadas pelo método SaveChanges. As atualizações não serão enviadas ao banco de

dados para entidades no estado inalterado (unchanged);

Entidades Adicionadas(Added) são inseridas no banco de dados e, em seguida, tem seu estado alterado para inalterado

(Unchanged) após o retorno do método SaveChanges;

Entidades modificadas(Modified) são atualizadas no banco de dados e, em seguida, tornam-se inalteradas (Unchanged) quando

o método SaveChanges retorna;

Entidades deletadas(Delete) são excluídas do banco de dados e então são separadas (Detached) do contexto;

Quem gerencia o estado de um entidade é o Object Context que representa o entity container definido em um modelo conceitual e

contém a conexão correspondente à fonte de dados e fornece serviços como o gerenciamento de estado e resolução de identidade.

Um object context é representado por uma instância da classe ObjectContext.

Objetivo

O objetivo deste artigo é mostrar de forma simples e descomplicada como realizar as operações CRUD no Entity Framework 4.1

Em resumo iremos realizar as seguintes tarefas:

Definir entity data model com base em um modelo conceitual;

Referenciar o assembly Entity Framework (EF);

Gerar os scripts para criação do banco de dados e tabelas

Realizar as operações CRUD na tabela criada;

Recursos

Os recursos necessários para acompanhar o artigo são:

Entity Framework 4.1

Microsoft SQL Server 2008: Express

Visual Web Developer 2010 Express | Microsoft Visual Studio

Page 2: Entity Framework 4 - Fazendo CRUD

26/2/2014 Entity Framework 4.1 - CRUD

http://www.macoratti.net/11/09/ef4_crud1.htm 2/8

Todos os recursos listados podem ser obtidos de forma gratuita.

Criando a aplicação ASP .NET

Abra o Visual Web Developer 2010 Express Edition e no menu File clique em New Project;

Na janela New Project selecione a linguagem de sua preferência (eu vou usar Visual Basic) e o template ASP .NET Web Application;

Nota: Este template ja cria uma estrutura de um projeto com páginas e arquivos que eu vou ajustar deixando apenas a página

Default.aspx e About.aspx;

A seguir informe o nome EF4_Produtos_Poco , a localização do projeto e clique no botão OK;

Definindo a classe POCO para a aplicação

Neste momento vamos definir as classes do nosso domínio que serão as nossas entidades gerenciadas pelo Entity Framework.

Aqui podemos usar o assistente e gerar um Entity Data Model ou definir as classes POCO. A vantagem da primeira é que é mais rápido

mas o modelo gerado traz consigo todo o arcabouço do Entity Framework. Usar as classes POCO dá mais trabalho (embora ele tenha

sido simplificado nesta versão) mas o código fica bem mais enxuto.

Antes de continuar temos que incluir uma referência ao Entity Framework 4.1 no nosso projeto;

- Clique com o botão direito do mouse sobre o projeto EF41_Produtos_CRUD e clique em Add Reference;

- Na janela Add Reference clique na guia Browse e selecione o assembly EntityFramework.dll do local onde você instalou o Entity

Framework 4.1 e clique em OK;

Page 3: Entity Framework 4 - Fazendo CRUD

26/2/2014 Entity Framework 4.1 - CRUD

http://www.macoratti.net/11/09/ef4_crud1.htm 3/8

Vamos incluir também uma referência ao namespace System.Data.Entity repetindo o processo assim e selecionando este namespace

conforme abaixo:

Vamos então incluir uma nova classe chamada CadastroPOCO.vb a partir do menu Project -> Add Class;

Em seguida defina o seguinte código nesta classe:

Public Class Produto

Public Property produtoid As Integer

Public Property produtonome As Integer

Public Property produtopreco As Double

Public Property produtoestoque As Double

End Class

É isso mesmo que você esta vendo definimos a classe Produto com 4 propriedades apenas.

Agora temos que definir uma classe para o nosso contexto chamada produtoContexto.vb a partir do menu Project -> Add Class;

O código desta classe é visto a seguir:

Imports System.Data.Entity

Public Class ProdutoContexto

Inherits DbContext

Public Property Produto As DbSet(Of Produto)

End Class

É tudo o que precisamos: uma classe que herde de DbContext e defina uma propriedade Produto do tipo DBSet.

O DbSet é um invólucro para ObjectSet e permite que na sua execução o banco de dados e as tabelas sejam criados com base na

modelo definido.

Lembre-se que no Entity Framework 4.1 temos:

- ObjectContext - que permite consultar, controle de alterações e salvar no banco de dados.

- ObjectSet - que encapsula os conjuntos de objetos semelhantes.

Dessa forma o DbContext é um invólucro para ObjectContext e além disso esta classe contém:

- Um conjunto de APIs que são mais fáceis de usar do que a exposta pelo ObjectContext;

- As APIs que permitem utilizar o recurso do Code-First e as convenções;

O EF Code First permite que você conecte facilmente suas classes POCO do modelo em um banco de dados através da criação de

uma classe "DbContext" que expõe propriedades públicas que mapeiam para tabelas do banco de dados. A classe produtoContexto

acima ilustra como isso pode ser feito. Ela está mapeando nossa Classe Produto para a tabela "Produtos".

Page 4: Entity Framework 4 - Fazendo CRUD

26/2/2014 Entity Framework 4.1 - CRUD

http://www.macoratti.net/11/09/ef4_crud1.htm 4/8

As propriedades da classe Produto por sua vez mapeiam para colunas na tabela Produto.

Dessa forma o banco de dados e a tabela Produto será criada usando uma convenção padrão adotada pelo Entity Framework.(Para

alterar esta convenção veja o meu artigo sobre Data Annotations)

Que tal criar o banco de dados e tabela e aproveitar para já incluir alguns dados na mesma. Vamos fazer isso incluindo uma nova

classe no projeto chamada InicializaBD.vb com o seguinte código:

Imports System.Data.Entity

Namespace EF_Produtos_CRUD

Public Class InicializaBD

Public Shared Sub geraTabelas(excluiBD As Boolean)

Using _contexto As New ProdutoContexto()

If excluiBD Then

_contexto.Database.Delete()

End If

Dim produto1 = New Produto() With {.produtonome = "Teclado", .produtopreco = 13, .produtoestoque = 10}

_contexto.Produto.Add(produto1)

Dim produto2 = New Produto() With {.produtonome = "Mouse Ótico", .produtopreco = 20, .produtoestoque = 5}

_contexto.Produto.Add(produto2)

_contexto.SaveChanges()

End Using

End Sub

End Class

End Namespace

Podemos ou não utilizar esta classe em nosso projeto e assim já criarmos a tabela com alguns dados armazenados. Você é quem

decide.

No exemplo eu não vou usar esta classe.

Definindo a interface da aplicação ASP .NET

Vamos definir o leiaute da página Default.aspx conforme a figura abaixo onde podemos ver que incluímos alguns controles TextBox,

Label e Button. Lembrando que estamos usando a Master Page Site.Master que foi ajustada também.

Finalmente vamos definir o código do arquivo code-behind Default.aspx.vb onde em cada evento Click de cada botão iremos incluir

o código pertinente.

Page 5: Entity Framework 4 - Fazendo CRUD

26/2/2014 Entity Framework 4.1 - CRUD

http://www.macoratti.net/11/09/ef4_crud1.htm 5/8

1- Botão Novo

Protected Sub btnNovo_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnNovo.Click

Using db As New ProdutoContexto

Dim produto As New Produto

produto.produtonome = txtProduto.Text

produto.produtopreco = Convert.ToDecimal(txtPreco.Text)

produto.produtoestoque = Convert.ToDouble(txtEstoque.Text)

db.Produto.Add(produto)

db.SaveChanges()

lblmsg.Text = "Registro incluido com sucesso !"

End Using

End Sub

Cria uma nova instância de Produto e atribui valores as propriedades e inclui o produto no contexto de entidades para em seguida

salvar o novo produto.

2 - Botão Atualiza

Protected Sub btnAtualiza_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnAtualiza.Click

Using db As New ProdutoContexto

Dim codigoProduto As Integer = Convert.ToInt32(txtCodigo.Text)

Dim produto As Produto = db.Produto.First(Function(p) p.produtoid = codigoProduto)

produto.produtonome = txtProduto.Text

produto.produtopreco = txtPreco.Text

produto.produtoestoque = txtEstoque.Text

db.SaveChanges()

lblmsg.Text = "Registro atualizado com sucesso !"

End Using

End Sub

Obtém o código do produto e realiza uma consulta lambda para localizar o produto exibindo as informações na página para alteração.

3- Botão Procurar

Protected Sub btnProcurar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnProcurar.Click

lblmsg.Text = ""

Using db As New ProdutoContexto

Dim codigo As Integer = Convert.ToInt32(txtCodigo.Text)

Try

Dim produto = db.Produto.Find(codigo)

txtCodigo.Text = produto.produtoid

txtProduto.Text = produto.produtonome

txtPreco.Text = produto.produtopreco

txtEstoque.Text = produto.produtoestoque

Catch ex As Exception

lblmsg.Text = "Registro não localizado !"

Limpar()

End Try

End Using

End Sub

Obtém o código do produto e realiza uma consulta LINQ para localizar o produto exibindo as informações na página.

4- Botão Excluir

Protected Sub btnExcluir_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnExcluir.Click

Using db As New ProdutoContexto

Dim codigoProduto As Integer = Convert.ToInt32(txtCodigo.Text)

Dim produto As Produto = db.Produto.First(Function(p) p.produtoid = codigoProduto)

Page 6: Entity Framework 4 - Fazendo CRUD

26/2/2014 Entity Framework 4.1 - CRUD

http://www.macoratti.net/11/09/ef4_crud1.htm 6/8

db.Produto.Attach(produto)

db.Entry(produto).State = EntityState.Deleted

db.SaveChanges()

lblmsg.Text = "Registro excluído com sucesso !"

End Using

End Sub

Obtém o código do produto e realiza uma consulta lambda para localizar o produto; em seguida anexa o produto e altera seu estado

para deletado para em seguida usar o método SaveChanges() para excluir a entidade.

5- Botão Limpar e método Limpar()

Protected Sub btnLimpar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnLimpar.Click

Limpar()

End Sub

Private Sub Limpar()

txtCodigo.Text = ""

txtProduto.Text = ""

txtPreco.Text = ""

txtEstoque.Text = ""

lblmsg.Text = ""

End Sub

Executando o projeto iremos obter a página Default.aspx onde digitando os valores nas caixas de texto e clicando no botão Incluir

temos a inclusão de um produto conforme a figura abaixo:

Após executarmos os projeto pela primeira vez se verificamos o SQL Server usando o SQL Server Management Studio iremos

Page 7: Entity Framework 4 - Fazendo CRUD

26/2/2014 Entity Framework 4.1 - CRUD

http://www.macoratti.net/11/09/ef4_crud1.htm 7/8

descobrir que o banco de dados e a tabela Produtoes foram criados conforme mostra a figura a seguir:

Note que executando uma consulta SQL na tabela também vemos o registro que acabamos de incluir.

A seguir temos as figuras para as operações de inclusão e procura de um produto

Após isso se consultarmos as tabelas no SQL Server veremos os dados persistidos conforme a figura abaixo:

Page 8: Entity Framework 4 - Fazendo CRUD

26/2/2014 Entity Framework 4.1 - CRUD

http://www.macoratti.net/11/09/ef4_crud1.htm 8/8

O Entity Framework fez todo o trabalho pesado para nós... Eta vida boa !

Pegue o projeto completo aqui: EF_Produtos_CRUD.zip

Louvai ao Senhor. Bem-aventurado o homem que teme ao Senhor, que em seus mandamentos tem grande prazer.

Salmos 112:1

Referências:

Seção VB .NET do Site Macoratti.netSuper DVD .NET - A sua porta de entrada na plataforma .NET

Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#

Seção C# do site Macoratti.net

Entity Frameweork 4 - Usando POCO, Code First e as convenções padrão

Desvendando o Entity Framework - O Entity Data Model.NET - Introdução ao ADO .NET Entity Framework IIDesvendando o Entity Framework - A classe EntityConnectionADO .NET Entity Framework - Usando LINQ to EnttiesApresentando LINQ to EntitiesEntity Framework - Conceitos Básicos - TerminologiaEntity Framework - Conceitos Básicos - Espiando o modelo conceitualEntity Framework - Conceitos Básicos - Usando Lazy Load e Eager LoadEntity Framework - Conceitos Básicos - Incluindo, modificando e excluindo objetosEntity Framework - Conceitos Básicos - Incluindo, modificando e excluindo objetos IIEntity Framework - Conceitos Básicos - Definindo um EDM usando a herança Table Per Type (TPT)Entity Framework - Model First - Criando o script para gerar o banco de dados a partir do modelo conceitual.Entity Framework - Usando o EF em aplicações ASP .NEThttp://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspxData Annotations in the Entity Framework and Code FirstEntity Frameweork 4 - Usando Data Annotations

José Carlos Macoratti