Criação de classes de modelo com o Entity Framework (VB)
pela Microsoft
Neste tutorial, você aprenderá a usar ASP.NET MVC com o Microsoft Entity Framework. Você aprenderá a usar o Assistente de Entidade para criar um modelo de dados de entidade ADO.NET. Ao longo deste tutorial, criamos um aplicativo Web que ilustra como selecionar, inserir, atualizar e excluir dados de banco de dados usando o Entity Framework.
O objetivo deste tutorial é explicar como você pode criar classes de acesso a dados usando o Microsoft Entity Framework ao criar um aplicativo MVC ASP.NET. Este tutorial pressupõe que não haja conhecimento prévio do Microsoft Entity Framework. Ao final deste tutorial, você entenderá como usar o Entity Framework para selecionar, inserir, atualizar e excluir registros de banco de dados.
O Microsoft Entity Framework é uma ferramenta O/RM (Mapeamento Relacional de Objetos) que permite gerar uma camada de acesso a dados de um banco de dados automaticamente. O Entity Framework permite evitar o trabalho tedioso de criar suas classes de acesso a dados manualmente.
Observação
Não há nenhuma conexão essencial entre ASP.NET MVC e o Microsoft Entity Framework. Há várias alternativas para o Entity Framework que você pode usar com ASP.NET MVC. Por exemplo, você pode criar suas classes de Modelo MVC usando outras ferramentas de O/RM, como Microsoft LINQ to SQL, NHibernate ou SubSonic.
Para ilustrar como você pode usar o Microsoft Entity Framework com ASP.NET MVC, criaremos um aplicativo de exemplo simples. Criaremos um aplicativo de Banco de Dados de Filme que permite exibir e editar registros de banco de dados de filme.
Este tutorial pressupõe que você tenha o Visual Studio 2008 ou o Visual Web Developer 2008 com Service Pack 1. Você precisa do Service Pack 1 para usar o Entity Framework. Você pode baixar o Visual Studio 2008 Service Pack 1 ou o Visual Web Developer com Service Pack 1 no seguinte endereço:
Criando o banco de dados de exemplo de filme
O aplicativo Movie Database usa uma tabela de banco de dados chamada Filmes que contém as seguintes colunas:
Nome da coluna | Tipo de Dados | Permitir Nulos? | A chave primária é? |
---|---|---|---|
ID | INT | Falso | True |
Title | nvarchar(100) | Falso | Falso |
Diretor | nvarchar(100) | Falso | Falso |
Você pode adicionar essa tabela a um projeto ASP.NET MVC seguindo estas etapas:
- Clique com o botão direito do mouse na pasta App_Data na janela Gerenciador de Soluções e selecione a opção de menu Adicionar, Novo Item.
- Na caixa de diálogo Adicionar Novo Item, selecione SQL Server Banco de Dados, dê ao banco de dados o nome MoviesDB.mdf e clique no botão Adicionar.
- Clique duas vezes no arquivo MoviesDB.mdf para abrir a janela Explorer de servidor/banco de dados Explorer.
- Expanda a conexão de banco de dados MoviesDB.mdf, clique com o botão direito do mouse na pasta Tabelas e selecione a opção de menu Adicionar Nova Tabela.
- Na Designer Tabela, adicione as colunas ID, Título e Diretor.
- Clique no botão Salvar (ele tem o ícone do disquete) para salvar a nova tabela com o nome Filmes.
Depois de criar a tabela de banco de dados Filmes, você deve adicionar alguns dados de exemplo à tabela. Clique com o botão direito do mouse na tabela Filmes e selecione a opção de menu Mostrar Dados da Tabela. Você pode inserir dados falsos de filme na grade exibida.
Criando o modelo de dados de entidade ADO.NET
Para usar o Entity Framework, você precisa criar um Modelo de Dados de Entidade. Você pode aproveitar o Assistente de Modelo de Dados de Entidade do Visual Studio para gerar um Modelo de Dados de Entidade de um banco de dados automaticamente.
Siga estas etapas:
- Clique com o botão direito do mouse na pasta Modelos na janela Gerenciador de Soluções e selecione a opção de menu Adicionar, Novo Item.
- Na caixa de diálogo Adicionar Novo Item , selecione a categoria Dados (consulte a Figura 1).
- Selecione o modelo ADO.NET Modelo de Dados de Entidade , dê ao Modelo de Dados de Entidade o nome MoviesDBModel.edmx e clique no botão Adicionar . Clicar no botão Adicionar inicia o Assistente de Modelo de Dados.
- Na etapa Escolher Conteúdo do Modelo , escolha a opção Gerar de um banco de dados e clique no botão Avançar (consulte a Figura 2).
- Na etapa Escolher Sua Conexão de Dados , selecione a conexão de banco de dados MoviesDB.mdf, insira o nome de configurações de conexão de entidades MoviesDBEntities e clique no botão Avançar (consulte a Figura 3).
- Na etapa Escolher Seus Objetos de Banco de Dados , selecione a tabela Banco de dados Filme e clique no botão Concluir (consulte a Figura 4).
Depois de concluir essas etapas, o ADO.NET Designer de Modelo de Dados de Entidade (Entity Designer) será aberto.
Figura 1 – Criando um novo modelo de dados de entidade
Figura 2 – Etapa Escolher Conteúdo do Modelo
Figura 3 – Escolher sua conexão de dados
Figura 4 – Escolher seus objetos de banco de dados
Modificando o modelo de dados de entidade ADO.NET
Depois de criar um Modelo de Dados de Entidade, você pode modificar o modelo aproveitando o Designer de Entidade (consulte a Figura 5). Você pode abrir a entidade Designer a qualquer momento clicando duas vezes no arquivo MoviesDBModel.edmx contido na pasta Modelos na janela Gerenciador de Soluções.
Figura 5 – O modelo de dados de entidade ADO.NET Designer
Por exemplo, você pode usar o Entity Designer para alterar os nomes das classes geradas pelo Assistente de Dados do Modelo de Entidade. O Assistente criou uma nova classe de acesso a dados chamada Filmes. Em outras palavras, o Assistente deu à classe o mesmo nome que a tabela de banco de dados. Como usaremos essa classe para representar uma instância de Filme específica, devemos renomear a classe de Filmes para Filme.
Se você quiser renomear uma classe de entidade, clique duas vezes no nome da classe no Designer entidade e insira um novo nome (consulte a Figura 6). Como alternativa, você pode alterar o nome de uma entidade no janela Propriedades depois de selecionar uma entidade no Designer entidade.
Figura 6 – Alterando um nome de entidade
Lembre-se de salvar seu Modelo de Dados de Entidade depois de fazer uma modificação clicando no botão Salvar (o ícone do disquete). Nos bastidores, a entidade Designer gera um conjunto de classes .NET do Visual Basic. Você pode exibir essas classes abrindo MoviesDBModel. Designer.vb na janela Gerenciador de Soluções.
Não modifique o código no arquivo Designer.vb, pois as alterações serão substituídas na próxima vez que você usar o Designer de Entidade. Se você quiser estender a funcionalidade das classes de entidade definidas no arquivo Designer.vb, poderá criar classes parciais em arquivos separados.
Selecionando registros de banco de dados com o Entity Framework
Vamos começar a criar nosso aplicativo de Banco de Dados de Filmes criando uma página que exibe uma lista de registros de filmes. O controlador Home na Listagem 1 expõe uma ação chamada Index(). A ação Index() retorna todos os registros de filme da tabela de banco de dados Movie aproveitando o Entity Framework.
Listagem 1 – Controllers\HomeController.vb
<HandleError()> _
Public Class HomeController
Inherits System.Web.Mvc.Controller
Private _db As MoviesDBEntities
Public Sub New()
_db = New MoviesDBEntities()
End Sub
Public Function Index()
ViewData.Model = _db.MovieSet.ToList()
Return View()
End Function
End Class
Observe que o controlador na Listagem 1 inclui um construtor. O construtor inicializa um campo de nível de classe chamado _db. O campo _db representa as entidades de banco de dados geradas pelo Microsoft Entity Framework. O campo _db é uma instância da classe MoviesDBEntities que foi gerada pelo Designer de Entidade.
O campo _db é usado dentro da ação Index() para recuperar os registros da tabela de banco de dados Movies. A expressão _db. MovieSet representa todos os registros da tabela de banco de dados Filmes. O método ToList() é usado para converter o conjunto de filmes em uma coleção genérica de objetos Movie: List( Of Movie).
Os registros do filme são recuperados com a ajuda de LINQ to Entities. A ação Index() na Listagem 1 usa a sintaxe do método LINQ para recuperar o conjunto de registros de banco de dados. Se preferir, você pode usar a sintaxe de consulta LINQ. As duas instruções a seguir fazem a mesma coisa:
ViewData.Model = _db.MovieSet.ToList()
ViewData.Model = (from m in _db.MovieSet select m).ToList()
Use qualquer sintaxe LINQ – sintaxe de método ou sintaxe de consulta – que você achar mais intuitiva. Não há diferença no desempenho entre as duas abordagens – a única diferença é o estilo.
O modo de exibição na Listagem 2 é usado para exibir os registros do filme.
Listagem 2 – Views\Home\Index.aspx
<%@ Page Language="VB"
Inherits="System.Web.Mvc.ViewPage(Of List(Of MvcApplication1.Movie))" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Index</title>
</head>
<body>
<div>
<% For Each m In Model%>
Title: <%= m.Title %>
<br />
Director: <%= m.Director %>
<br />
<%=Html.ActionLink("Edit", "Edit", New With {.id = m.Id})%>
<%=Html.ActionLink("Delete", "Delete", New With {.id = m.Id})%>
<hr />
<% Next%>
<%= Html.ActionLink("Add Movie", "Add") %>
</div>
</body>
</html>
O modo de exibição na Listagem 2 contém um loop For Each que itera em cada registro de filme e exibe os valores das propriedades Title e Director do registro de filme. Observe que um link Editar e Excluir é exibido ao lado de cada registro. Além disso, um link Adicionar Filme aparece na parte inferior do modo de exibição (consulte a Figura 7).
Figura 7 – A exibição Índice
A exibição Índice é uma exibição tipada. A exibição Índice tem uma <diretiva %@ Page %> que inclui um atributo Inherits. O atributo Inherits converte a propriedade ViewData.Model em uma coleção list genérica fortemente tipada de objetos Movie – uma List(Of Movie).
Inserindo registros de banco de dados com o Entity Framework
Você pode usar o Entity Framework para facilitar a inserção de novos registros em uma tabela de banco de dados. A listagem 3 contém duas novas ações adicionadas à classe de controlador Home que você pode usar para inserir novos registros na tabela de banco de dados Movie.
Listagem 3 – Controllers\HomeController.vb (adicionar métodos)
<HandleError()> _
Public Class HomeController
Inherits System.Web.Mvc.Controller
Public Function Add()
Return View()
End Function
<AcceptVerbs(HttpVerbs.Post)> _
Public Function Add(ByVal form As FormCollection)
Dim movieToAdd As New Movie()
' Deserialize (Include white list!)
TryUpdateModel(movieToAdd, New String() {"Title", "Director"}, form.ToValueProvider())
' Validate
If String.IsNullOrEmpty(movieToAdd.Title) Then
ModelState.AddModelError("Title", "Title is required!")
End If
If String.IsNullOrEmpty(movieToAdd.Director) Then
ModelState.AddModelError("Director", "Director is required!")
End If
' If valid, save movie to database
If (ModelState.IsValid) Then
_db.AddToMovieSet(movieToAdd)
_db.SaveChanges()
Return RedirectToAction("Index")
End If
' Otherwise, reshow form
Return View(movieToAdd)
End Function
End Class
A primeira ação Add() simplesmente retorna um modo de exibição. O modo de exibição contém um formulário para adicionar um novo registro de banco de dados de filme (consulte a Figura 8). Quando você envia o formulário, a segunda ação Add() é invocada.
Observe que a segunda ação Add() é decorada com o atributo AcceptVerbs. Essa ação só pode ser invocada ao executar uma operação HTTP POST. Em outras palavras, essa ação só pode ser invocada ao postar um formulário HTML.
A segunda ação Add() cria uma nova instância da classe Entity Framework Movie com a ajuda do método TryUpdateModel() do ASP.NET MVC. O método TryUpdateModel() usa os campos no FormCollection passados para o método Add() e atribui os valores desses campos de formulário HTML à classe Movie.
Ao usar o Entity Framework, você deve fornecer uma "lista segura" de propriedades ao usar os métodos TryUpdateModel ou UpdateModel para atualizar as propriedades de uma classe de entidade.
Em seguida, a ação Add() executa uma validação de formulário simples. A ação verifica se as propriedades Title e Director têm valores. Se houver um erro de validação, uma mensagem de erro de validação será adicionada a ModelState.
Se não houver erros de validação, um novo registro de filme será adicionado à tabela de banco de dados Filmes com a ajuda do Entity Framework. O novo registro é adicionado ao banco de dados com as duas seguintes linhas de código:
_db.AddToMovieSet(movieToAdd)
_db.SaveChanges()
A primeira linha de código adiciona a nova entidade Movie ao conjunto de filmes que estão sendo rastreados pelo Entity Framework. A segunda linha de código salva todas as alterações feitas nos Filmes que estão sendo rastreados de volta para o banco de dados subjacente.
Figura 8 – O modo de exibição Adicionar
Atualizando registros de banco de dados com o Entity Framework
Você pode seguir quase a mesma abordagem para editar um registro de banco de dados com o Entity Framework como a abordagem que acabamos de seguir para inserir um novo registro de banco de dados. A listagem 4 contém duas novas ações do controlador chamadas Edit(). A primeira ação Edit() retorna um formulário HTML para editar um registro de filme. A segunda ação Edit() tenta atualizar o banco de dados.
Listagem 4 – Controllers\HomeController.vb (métodos Editar)
<HandleError()> _
Public Class HomeController
Inherits System.Web.Mvc.Controller
Public Function Edit(ByVal id As Integer)
' Get movie to update
Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)
ViewData.Model = movieToUpdate
Return View()
End Function
<AcceptVerbs(HttpVerbs.Post)> _
Public Function Edit(ByVal form As FormCollection)
' Get movie to update
Dim id As Integer = Integer.Parse(form("id"))
Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)
' Deserialize (Include white list!)
TryUpdateModel(movieToUpdate, New String() {"Title", "Director"}, form.ToValueProvider)
' Validate
If String.IsNullOrEmpty(movieToUpdate.Title) Then
ModelState.AddModelError("Title", "Title is required!")
End If
If String.IsNullOrEmpty(movieToUpdate.Director) Then
ModelState.AddModelError("Director", "Director is required!")
End If
' If valid, save movie to database
If (ModelState.IsValid) Then
_db.SaveChanges()
Return RedirectToAction("Index")
End If
' Otherwise, reshow form
Return View(movieToUpdate)
End Function
End Class
A segunda ação Edit() começa recuperando o registro Movie do banco de dados que corresponde à ID do filme que está sendo editado. A seguinte instrução LINQ to Entities captura o primeiro registro de banco de dados que corresponde a uma ID específica:
Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)
Em seguida, o método TryUpdateModel() é usado para atribuir os valores dos campos de formulário HTML às propriedades da entidade de filme. Observe que uma lista de segurança é fornecida para especificar as propriedades exatas a serem atualizadas.
Em seguida, algumas validações simples são executadas para verificar se as propriedades Título do Filme e Diretor têm valores. Se uma propriedade não tiver um valor, uma mensagem de erro de validação será adicionada a ModelState e ModelState.IsValid retornará o valor false.
Por fim, se não houver erros de validação, a tabela de banco de dados Movies subjacente será atualizada com quaisquer alterações chamando o método SaveChanges().
Ao editar registros de banco de dados, você precisa passar a ID do registro que está sendo editado para a ação do controlador que executa a atualização do banco de dados. Caso contrário, a ação do controlador não saberá qual registro atualizar no banco de dados subjacente. O modo de exibição Editar, contido na Listagem 5, inclui um campo de formulário oculto que representa a ID do registro de banco de dados que está sendo editado.
Listagem 5 – Views\Home\Edit.aspx
<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication1.Movie)" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Edit</title>
<style type="text/css">
.input-validation-error
{
background-color:Yellow;
}
</style>
</head>
<body>
<div>
<h1>Edit Movie</h1>
<form method="post" action="/Home/Edit">
<!-- Include Hidden Id -->
<%= Html.Hidden("id") %>
Title:
<br />
<%= Html.TextBox("title") %>
<br /><br />
Director:
<br />
<%= Html.TextBox("director") %>
<br /><br />
<input type="submit" value="Edit Movie" />
</form>
</div>
</body>
</html>
Excluindo registros de banco de dados com o Entity Framework
A operação final do banco de dados, que precisamos abordar neste tutorial, é excluir registros de banco de dados. Você pode usar a ação do controlador na Listagem 6 para excluir um registro de banco de dados específico.
Listagem 6 -- \Controllers\HomeController.vb (ação Excluir)
<HandleError()> _
Public Class HomeController
Inherits System.Web.Mvc.Controller
Public Function Delete(ByVal id As Integer)
' Get movie to delete
Dim movieToDelete As Movie = _db.MovieSet.First(Function(m) m.Id = id)
' Delete
_db.DeleteObject(movieToDelete)
_db.SaveChanges()
' Show Index view
Return RedirectToAction("Index")
End Function
End Class
A ação Delete() primeiro recupera a entidade Movie que corresponde à ID passada para a ação. Em seguida, o filme é excluído do banco de dados chamando o método DeleteObject() seguido pelo método SaveChanges(). Por fim, o usuário é redirecionado de volta para a exibição Índice.
Resumo
A finalidade deste tutorial foi demonstrar como você pode criar aplicativos Web controlados por banco de dados aproveitando ASP.NET MVC e o Microsoft Entity Framework. Você aprendeu a criar um aplicativo que permite selecionar, inserir, atualizar e excluir registros de banco de dados.
Primeiro, discutimos como você pode usar o Assistente de Modelo de Dados de Entidade para gerar um Modelo de Dados de Entidade de dentro do Visual Studio. Em seguida, você aprenderá a usar LINQ to Entities para recuperar um conjunto de registros de banco de dados de uma tabela de banco de dados. Por fim, usamos o Entity Framework para inserir, atualizar e excluir registros de banco de dados.