Compartilhar via


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:

https://www.asp.net/downloads/

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:

  1. 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.
  2. 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.
  3. Clique duas vezes no arquivo MoviesDB.mdf para abrir a janela Explorer de servidor/banco de dados Explorer.
  4. 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.
  5. Na Designer Tabela, adicione as colunas ID, Título e Diretor.
  6. 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:

  1. 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.
  2. Na caixa de diálogo Adicionar Novo Item , selecione a categoria Dados (consulte a Figura 1).
  3. 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.
  4. 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).
  5. 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).
  6. 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

clip_image002

Figura 2 – Etapa Escolher Conteúdo do Modelo

clip_image004

Figura 3 – Escolher sua conexão de dados

clip_image006

Figura 4 – Escolher seus objetos de banco de dados

clip_image008

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

clip_image010

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

clip_image012

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

clip_image014

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

clip_image016

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.