GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

download GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

of 203

Transcript of GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    1/203

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    2/203

    Desenvolvimento Web com ASP.NET MVC

    22 de junho de 2011

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    3/203

    www.k19.com.br ii

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    4/203

    Sumrio

    1 Banco de dados 1

    1.1 Sistemas gerenciadores de banco de dados . . . . . . . . . . . . . . . . . . . . 11.2 SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

    1.3 Bases de dados (Databases) . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3.1 Criando uma base de dados no SQL Server Express . . . . . . . . . . . 2

    1.4 Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.4.1 Criando tabelas no SQL Server Express . . . . . . . . . . . . . . . . . 5

    1.5 Operaes Bsicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.6 Chaves Primria e Estrangeira . . . . . . . . . . . . . . . . . . . . . . . . . . 101.7 Consultas Avanadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.8 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    2 ADO.NET 29

    2.1 Driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.2 ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.3 ODBC Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.4 Criando uma conexo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.5 Inserindo registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322.7 SQL Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332.8 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342.9 Listando registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352.10 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

    2.11 Fbrica de conexes (Factory) . . . . . . . . . . . . . . . . . . . . . . . . . . 372.12 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    3 Entity Framework 4.1 41

    3.1 Mltiplas sintaxes da linguagem SQL . . . . . . . . . . . . . . . . . . . . . . 413.2 Orientao a Objetos VS Modelo Entidade Relacionamento . . . . . . . . . . . 413.3 Ferramentas ORM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413.4 Configurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423.5 Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423.6 Gerando o banco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473.8 Sobrescrevendo o nome do Banco de Dados . . . . . . . . . . . . . . . . . . . 503.9 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

    iii

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    5/203

    SUMRIO SUMRIO

    3.10 Manipulando entidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513.10.1 Persistindo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513.10.2 Buscando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

    3.10.3 Removendo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523.10.4 Atualizando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523.10.5 Listando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    3.11 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523.12 Repository . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533.13 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    4 Viso Geral do ASP .NET MVC 57

    4.1 Necessidades de uma aplicao web . . . . . . . . . . . . . . . . . . . . . . . 574.2 Viso Geral do ASP .NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . 57

    4.3 Aplicao de exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584.3.1 Testando a aplicao . . . . . . . . . . . . . . . . . . . . . . . . . . . 594.3.2 Trocando a porta do servidor . . . . . . . . . . . . . . . . . . . . . . . 59

    4.4 Pgina de Saudao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604.6 Alterando a pgina inicial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604.8 Integrando o Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . 604.9 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614.10 Listando entidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

    4.11 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654.12 Inserindo entidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654.13 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684.14 Alterando entidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

    4.14.1 Link de alterao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744.15 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754.16 Removendo entidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774.17 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

    5 Tratamento de Erros 81

    5.1 Try-Catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835.3 Custom Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845.5 Erros do HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

    6 Camada de Apresentao (View) 87

    6.1 Inline Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876.2 Utilizando Inline Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 896.3 ViewData, ViewBag e Model . . . . . . . . . . . . . . . . . . . . . . . . . . . 916.4 HTML Helpers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

    6.4.1 ActionLink Helper . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

    www.k19.com.br iv

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    6/203

    SUMRIO SUMRIO

    6.4.2 Helpers de Formulrios . . . . . . . . . . . . . . . . . . . . . . . . . . 946.4.3 DropDownList Helper . . . . . . . . . . . . . . . . . . . . . . . . . . 976.4.4 Editor Helper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

    6.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036.6 Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

    6.6.1 Contedo comum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1076.6.2 Lacunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

    6.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1126.8 Importao Automtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1166.9 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1176.10 Dividindo o contedo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1176.11 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

    7 Controle (Controller) 121

    7.1 Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1217.2 ActionResult . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1227.3 Parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

    7.3.1 Vrios parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1237.3.2 Por objeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

    7.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1247.5 TempData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1257.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

    8 Rotas 127

    8.1 Adicionando uma rota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1288.2 Definindo parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1288.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

    9 Validao 131

    9.1 Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1319.2 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1329.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1349.4 Anotaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

    9.4.1 Required . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1389.4.2 Alterando a mensagem . . . . . . . . . . . . . . . . . . . . . . . . . . 1399.4.3 Outros validadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

    9.5 Validao no lado do Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . 1409.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

    10 Sesso 145

    10.1 Sesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14510.1.1 Identificando o Usurio . . . . . . . . . . . . . . . . . . . . . . . . . . 145

    10.2 Utilizando Session no ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . 14610.3 Session Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14710.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

    v K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    7/203

    SUMRIO SUMRIO

    11 Filtros 157

    11.1 Filtro de Autenticao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15711.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

    11.3 Action Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15911.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

    12 Projeto 161

    12.1 Modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16112.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16112.3 Persistncia - Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16212.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16212.5 Persistncia - Configurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16312.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163

    12.7 Persistncia - Repositrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16412.8 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16412.8.1 Unit of Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

    12.9 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16612.10Apresentao - Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16812.11Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16812.12Cadastrando e Listando Selees . . . . . . . . . . . . . . . . . . . . . . . . . 17012.13Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17012.14Removendo Selees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17312.15Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17312.16Cadastrando, Listando e Removendo Jogadores . . . . . . . . . . . . . . . . . 17512.17Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17512.18Removendo Jogadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17812.19Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17812.20Membership e Autorizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18112.21Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181

    12.21.1 Adicionando um Usurio Administrador com ASP .NET Configuration 18912.22Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

    12.22.1 Autorizao Role-based . . . . . . . . . . . . . . . . . . . . . . . . . 19112.23Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19112.24Controle de Erro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

    12.25Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19312.26Enviando email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19412.27Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194

    www.k19.com.br vi

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    8/203

    Captulo 1

    Banco de dados

    O nosso objetivo desenvolver aplicaes em C#. Essas aplicaes necessitam armazenaras informaes relacionadas ao seu domnio em algum lugar. Por exemplo, uma aplicao degerenciamento de uma livraria deve armazenar os dados dos livros que ela comercializa. Umaforma de suprir essa necessidade seria armazenar essas informaes em arquivos. Contudo,alguns fatores importantes nos levam a descartar tal opo.

    A seguir, apresentamos as principais preocupaes a serem consideradas ao trabalhar comdados:

    Segurana: As informaes potencialmente confidenciais devem ser controladas de forma queapenas usurios e sistemas autorizados tenham acesso a elas.

    Integridade: Eventuais falhas de software ou hardware no devem corromper os dados.Acesso: As funes de consulta e manipulao dos dados devem ser implementadas.

    Concorrncia: Usualmente, diversos sistemas e usurios acessaro as informaes de formaconcorrente. Apesar disso, os dados no podem ser perdidos ou corrompidos.

    Considerando todos esses aspectos, conclumos que seria necessria a utilizao de umsistema complexo para manusear as informaes das nossas aplicaes.

    Felizmente, tal tipo de sistema j existe e conhecido como Sistema Gerenciador deBanco de Dados (SGBD).

    1.1 Sistemas gerenciadores de banco de dados

    No mercado, h diversas opes de sistemas gerenciadores de banco de dados. A seguir,apresentamos os mais populares:

    1

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    9/203

    Banco de dados

    Oracle

    SQL Server

    SQL Server Express

    PostgreSQL

    1.2 SQL Server

    Neste treinamento, utilizaremos o SQL Server Express, que mantido pela Microsoft. OSQL Server Express pode ser obtido a partir do site:http://www.microsoft.com/express/Database/ .

    Microsoft SQL Server Management Studio Express

    Para interagir com o SQL Server Express, utilizaremos um cliente com interface grficachamado de Microsoft SQL Server Management Studio Express.

    1.3 Bases de dados (Databases)

    Um sistema gerenciador de banco de dados capaz de gerenciar informaes de diversossistemas ao mesmo tempo. Por exemplo, as informaes dos clientes de um banco, alm dosprodutos de uma loja virtual.

    Caso os dados fossem mantidos sem nenhuma separao lgica, a organizao ficaria pre-judicada. Alm disso, seria mais difcil implementar regras de segurana referentes ao acessodos dados. Tais regras criam restries quanto ao contedo acessvel por cada usurio. Deter-

    minado usurio, por exemplo, poderia ter permisso de acesso aos dados dos clientes do banco,mas no s informaes dos produtos da loja virtual, ou vice-versa.

    Ento, por questes de organizao e segurana, os dados devem ser armazenados separa-damente no SGBD. Da surge o conceito de base de dados (database).

    Uma base de dados um agrupamento lgico das informaes de um determinado domnio,como, por exemplo, os dados da nossa livraria.

    1.3.1 Criando uma base de dados no SQL Server Express

    Para criar uma base de dados no SQL Server Express, utilizamos o comando CREATEDATABASE.

    www.k19.com.br 2

    http://www.microsoft.com/express/Database/http://www.microsoft.com/express/Database/
  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    10/203

    Banco de dados

    3 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    11/203

    Banco de dados

    Repare que alm da base de dados livraria h outras bases. Essas bases foram criadasautomaticamente pelo prprio SQL Server Express para teste ou para guardar algumas confi-guraes.

    Quando uma base de dados no mais necessria, ela pode ser removida atravs do co-

    mando DROP DATABASE.

    1.4 Tabelas

    Um servidor de banco de dados dividido em bases de dados com o intuito de separaras informaes de sistemas diferentes. Nessa mesma linha de raciocnio, podemos dividir osdados de uma base a fim de agrup-los segundo as suas correlaes. Essa separao feitaatravs de tabelas. Por exemplo, no sistema de um banco, interessante separar o saldo e olimite de uma conta, do nome e CPF de um cliente. Ento, poderamos criar uma tabela para

    os dados relacionados s contas e outra para os dados relacionados aos clientes.

    ClientesNome Idade CpfJos 27 31875638735Maria 32 30045667856

    ContasNumero Saldo Limite1 1000 5002 2000 700

    www.k19.com.br 4

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    12/203

    Banco de dados

    Uma tabela formada por registros(linhas) e os registros so formados por campos(colunas).Por exemplo, suponha uma tabela para armazenar as informaes dos clientes de um banco.Cada registro dessa tabela armazena em seus campos os dados de um determinado cliente.

    1.4.1 Criando tabelas no SQL Server Express

    As tabelas no SQL Server Express so criadas atravs do comando CREATE TABLE. Nacriao de uma tabela necessrio definir quais so os nomes e os tipos das colunas.

    5 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    13/203

    Banco de dados

    www.k19.com.br 6

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    14/203

    Banco de dados

    No SQL Server os nomes das tabelas so precedidas pelo ID do usurio que possui a tabela.No caso do usurio sa, o ID dbo. Portanto o nome da tabela Livros fica dbo.Livros.

    Se uma tabela no for mais desejada ela pode ser removida atravs do comando DROPTABLE.

    7 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    15/203

    Banco de dados

    1.5 Operaes Bsicas

    As operaes bsicas para manipular os dados das tabelas so: inserir, ler, alterar e remover.Essas operaes so realizadas atravs da linguagem de consulta denominada SQL. Estalinguagem oferece quatro comandos bsicos: INSERT, SELECT, UPDATE e DELETE.Estes comandos so utilizados para inserir, ler, alterar e remover registros respectivamente.

    www.k19.com.br 8

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    16/203

    Banco de dados

    9 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    17/203

    Banco de dados

    1.6 Chaves Primria e Estrangeira

    Suponha que os livros da nossa livraria so separados por editoras. Uma editora possuinome e telefone. Para armazenar esses dados, uma nova tabela deve ser criada.

    Nesse momento, teramos duas tabelas (Livros e Editoras). Eventualmente, ser necessrio

    www.k19.com.br 10

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    18/203

    Banco de dados

    descobrir qual a editora de um determinado livro ou quais so os livros de uma determinadaeditora. Para isso, os registros da tabela Editoras devem estar relacionados aos da tabelaLivros.

    Na tabela Livros, poderamos adicionar uma coluna para armazenar o nome da editora aqual ele pertence. Dessa forma, se algum quiser recuperar as informaes da editora de umdeterminado livro, deve consultar a tabela Livros para obter o nome da editora correspondente.Depois, com esse nome, deve consultar a tabela Editoras para obter as informaes da editora.

    Porm, h um problema nessa abordagem, a tabela Editoras aceita duas editoras com omesmo nome. Dessa forma, eventualmente, no conseguiramos descobrir os dados corretos daeditora de um determinado livro. Para resolver esse problema, deveramos criar uma restriona tabela Editoras que proba a insero de editoras com o mesmo nome.

    Para resolver esse problema no SQL Server Express, poderamos adicionar a propriedadeUNIQUE no campo nome da tabela Editoras. Porm ainda teramos mais um problema: na

    tabela livro poderamos adicionar registros com editoras inexistentes, pois no h nenhum vn-culo explcito entre as tabelas. Para solucionar estes problemas, devemos utilizar o conceito dechave primria e chave estrangeira.

    Toda tabela pode ter uma chave primria, que um conjunto de um ou mais campos quedevem ser nicos para cada registro. Normalmente, um campo numrico escolhido para ser achave primria de uma tabela, pois as consultas podem ser realizadas com melhor desempenho.

    Ento, poderamos adicionar um campo numrico na tabela Editoras e torn-lo chave pri-mria. Vamos chamar esse campo de Id. Na tabela Livros, podemos adicionar um camponumrico chamado EditoraId que deve ser utilizado para guardar o valor da chave primriada editora correspondente ao livro. Alm disso, o campo EditoraId deve estar explicitamente

    vinculado com o campo id da tabela Editoras. Para estabelecer esse vnculo o campo EditoraIddeve ser uma chave estrangeira associada ao campo Id.Uma chave estrangeira um conjunto de uma ou mais colunas de uma tabela que possuem

    valores iguais aos da chave primria de outra tabela.Com a definio da chave estrangeira, um livro no pode ser inserido com o valor do campo

    EditoraId invlido. Caso tentssemos obteramos uma mensagem de erro.

    1.7 Consultas Avanadas

    Com o conceito de chave estrangeira, podemos fazer consultas complexas envolvendo osregistros de duas ou mais tabelas. Por exemplo, descobrir todos os livros de uma determinadaeditora.

    1.8 Exerccios

    1. Abrao Microsoft SQL Server Management Studio Express utilizando NOME_DA_MAQUINASQLEXPRESS como Server Name, SQL Server Authentication como Authentication,sa como Login e sa como Password.

    11 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    19/203

    Banco de dados

    2. Caso exista uma base de dados chamada Livraria, remova-a conforme a figura abaixo:

    www.k19.com.br 12

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    20/203

    Banco de dados

    3. Crie uma nova base de dados chamada livraria, conforme mostrado na figura abaixo.Voc vai utilizar esta base nos exerccios seguintes.

    13 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    21/203

    Banco de dados

    www.k19.com.br 14

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    22/203

    Banco de dados

    4. Crie uma tabela chamada Editoras conforme as figuras abaixo.

    15 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    23/203

    Banco de dados

    Altere os campos para torn-los obrigatrios, NO permitindo que eles fiquem em brancoNULL.

    www.k19.com.br 16

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    24/203

    Banco de dados

    Alm disso o campo Id deve ser uma chave primria.

    17 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    25/203

    Banco de dados

    O campo Id dever ser incrementado automaticamente. Defina ele com a propriedadeIdentity segundo a figura abaixo:

    www.k19.com.br 18

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    26/203

    Banco de dados

    5. Crie uma tabela chamada Livros conforme as figuras abaixo:

    19 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    27/203

    Banco de dados

    Lembrando de NO marcar a opo ALLOW NULL. Alm disso o campo Id deve ser

    uma chave primria e automaticamente incrementada.

    Voc precisa tornar o campo EditoraId uma chave estrangeira. Clique com o botodireito sobre a coluna EditoraId e selecione a opo Relantioships..., conforme a figuraabaixo:

    www.k19.com.br 20

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    28/203

    Banco de dados

    Devemos acrescentar o relacionamento entre livro e editora. Clique em Add e posterior-mente no boto direita na linha Tables and Columns Specification.

    21 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    29/203

    Banco de dados

    Devemos informar qual a chave primria que a coluna EditoraId da tabela Livros faz

    referncia. Para isto, informe a tabela Editoras como Primary Key Table e indique acoluna Id como a chave primria referenciada. Selecione a coluna EditoraId como acoluna que ir fazer referncia a chave primria da tabela Editoras.

    6. Adicione alguns registros na tabela Editoras. Veja exemplos na figura abaixo:

    www.k19.com.br 22

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    30/203

    Banco de dados

    7. Adicione alguns registros na tabela Livros. Veja exemplos na figura abaixo:

    23 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    31/203

    Banco de dados

    8. Consulte os registros da tabela Editoras, e em seguida consulte a tabela Livros. Vejaexemplos logo abaixo:

    9. Altere alguns dos registros da tabela Livros. Veja o exemplo abaixo:

    www.k19.com.br 24

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    32/203

    Banco de dados

    10. Altere alguns dos registros da tabela Editoras. Veja o exemplo abaixo:

    11. Remova alguns registros da tabela Livros. Veja o exemplo abaixo:

    25 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    33/203

    Banco de dados

    12. Remova alguns registros da tabela Editoras. Preste ateno para no remover uma editoraque tenha algum livro relacionado j adicionado no banco. Veja o exemplo abaixo:

    13. Faa uma consulta para buscar todos os livros de uma determinada editora. Veja umexemplo na figura abaixo:

    www.k19.com.br 26

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    34/203

    Banco de dados

    27 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    35/203

    Banco de dados

    www.k19.com.br 28

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    36/203

    Captulo 2

    ADO.NET

    No captulo anterior, aprendemos que utilizar bancos de dados uma boa soluo para oarmazenamento dos dados do estoque de uma loja virtual. Entretanto, voc deve ter percebidoque a interface de utilizao do SQL Server Express (e dos outros bancos de dados em geral)no muito amigvel. Ela exige que o usurio conhea a sintaxe do SQL para escrever asconsultas. Alm disso, quando o volume de dados muito grande, mais difcil visualizar osresultados.

    Na prtica uma aplicao com interface simples desenvolvida para permitir que os usu-rios do sistema possam manipular os dados do banco. De alguma forma, essa aplicao precisase comunicar com o banco de dados utilizado no sistema.

    Nesse captulo vamos desenvolver uma aplicao para acessar os dados do estoque da nossa

    loja virtual.

    2.1 Driver

    Como a aplicao precisa conversar com o banco de dados, ela deve trocar mensagenscom o mesmo. O formato das mensagens precisa ser definido previamente. Por questes deeconomia de espao, cada bit de uma mensagem tem um significado diferente. Em outraspalavras, o protocolo de comunicao binrio.

    Mensagens definidas com protocolos binrios so facilmente interpretadas por computado-

    res. Por outro lado, so complexas para um ser humano compreender. Dessa forma, maistrabalhoso e mais suscetvel a erro desenvolver uma aplicao que converse com um banco dedados atravs de mensagens binrias.

    Para resolver esse problema e facilitar o desenvolvimento de aplicaes que devem se co-municar com bancos de dados, as empresas que so proprietrias desses bancos oferecem osdrivers de conexo.

    Os drivers de conexo atuam como tradutores de comandos escritos em uma determinadalinguagem de programao para comandos no protocolo do banco de dados. Do ponto de vistado desenvolvedor da aplicao, no necessrio conhecer o complexo protocolo binrio dobanco.

    Em alguns casos, o protocolo binrio de um determinado banco de dados fechado. Con-sequentemente, a nica maneira de se comunicar com o banco de dados atravs de um driverde conexo.

    29

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    37/203

    ADO.NET

    2.2 ODBC

    Suponha que os proprietrios dos bancos de dados desenvolvessem os drivers de maneiratotalmente independente. Consequentemente, cada driver teria sua prpria interface, ou seja,seu prprio conjunto de instrues. Dessa maneira, o desenvolvedor da aplicao precisa co-nhecer as instrues de cada um dos drivers dos respectivos bancos que ele for utilizar.

    Para facilitar o trabalho do desenvolvedor da aplicao, a Microsoft definiu uma especifi-

    cao chamada ODBC (Open Database Connectivity) para padronizar a interface dos drivers deconexo. Assim, quando uma empresa proprietria de um banco de dados pretende desenvolverum driver, ela segue essa especificao com o intuito de populariz-lo.

    Os drivers de conexo que respeitam a especificao ODBC, ou seja, possuem um conjuntode comandos padronizados, so chamados de drivers de conexo ODBC.

    2.3 ODBC Manager

    Para que drivers ODBC possam ser instalados em uma mquina e as aplicaes consigamutiliz-los necessrio ter o ODBC Manager, que j vem instalado no Windows.

    O driver de conexo ODBC j est disponvel para utilizao, podemos consultar o ODBCManager do Windows. O ODBC Manager pode ser executado atravs do item FerramentasAdministrativas do Painel de Controle.

    www.k19.com.br 30

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    38/203

    ADO.NET

    2.4 Criando uma conexo

    Com o driver de conexo ODBC instalado na mquina j possvel criar uma conexo como banco de dados correspondente. O que necessrio para estabelecer uma conexo com obanco de dados?

    Escolher o driver de conexo;

    Definir a localizao do banco de dados;

    Informar o nome da base de dados;

    Ter um usurio e senha cadastrados no banco de dados.

    Todas essas informaes so definidas na chamada string de conexo.

    1 string stringDeConexao = @"driver={SQL Server};2 server=MARCELO-PC\SQLEXPRESS;database=livraria;uid=sa;pwd=sa;" ;

    31 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    39/203

    ADO.NET

    Aps a definio da string de conexo, podemos utilizar a classe do .NET Frameworkque responsvel por criar conexes ODBC. Esta classe que vamos utilizar a System.Data.Odbc.OdbcConnection .

    1 OdbcConnection conexao = new OdbcConnection(stringDeConexao);

    2.5 Inserindo registros

    Estabelecida a conexo com o banco de dados, j podemos executar comandos. Por exem-plo, j podemos inserir registros nas tabelas. O primeiro passo para executar um comando defin-lo em linguagem SQL.

    1 string textoDoComando = @"INSERT INTO Editoras (Nome, Email)2 VALUES (Abril, [email protected]);";

    Em seguida, devemos criar um objeto da classe System. Data.Odbc.OdbcCommandvincu-lado ao texto do comando e conexo previamente criada. O comando no executado quandoos objetos dessa classe so instanciados.

    1 OdbcCommand comando = new OdbcCommand(textoDoComando, conexao);

    Por fim, o comando pode ser executado atravs do mtodo ExecuteNonQuery. A conexodeve ser aberta antes de executar o comando.

    1 conexao.Open();2 comando.ExecuteNonQuery();

    Se a aplicao mantiver as conexes abertas o banco de dados pode deixar de atender outrasaplicaes pois h um limite de conexes que o banco pode suportar. Portanto, importanteque as conexes sejam fechadas quando no forem mais necessrias.

    1 conexao.Close();

    2.6 Exerccios

    1. Crie um projeto do tipo Console Application no Microsoft Visual C# Express, chamadoODBC.

    2. Utilizando o projeto do exerccio anterior, faa um programa para inserir registros natabela Editoras.

    www.k19.com.br 32

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    40/203

    ADO.NET

    1 using System.Data.Odbc;23 namespace Odbc4 {

    5 class InsereEditora6 {7 static void Main(string[] args)8 {9 string stringDeConexao = @"driver={SQL Server};

    10 server=MARCELO-PC\SQLEXPRESS;database=livraria;uid=sa;pwd=sa;" ;11121314 using (OdbcConnection conexao = new OdbcConnection(stringDeConexao))15 {16 string textoInsereEditora =17 "INSERT INTO Editoras (Nome, Email) Values(Abril, [email protected])"

    ;18 OdbcCommand command = new OdbcCommand(textoInsereEditora, conexao);19 conexao.Open();

    20 command.ExecuteNonQuery();2122 // A Conexao eh automaticamente fechada23 // ao final do bloco Using.24 }25 }26 }27 }

    3. (Opcional) Analogamente, ao exerccio anterior crie um programa para inserir livros.

    2.7 SQL Injection

    Da maneira que implementamos a insero de categorias, h duas falhas: uma de seguranae outra tcnica. A falha de segurana ocorre quando uma pessoa mal intencionada ao preencherum formulrio, digita propositalmente uma sentena em SQL que provoca um comportamentono previsto.

    Esse comportamento, pode por vezes, comprometer a segurana, s vezes mostrando pessoa mal intencionada informaes confidenciais, em outras pode apagar informaes dobanco. Esse tipo de ataque conhecido como SQL Injection.

    33 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    41/203

    ADO.NET

    O problema de SQL Injection pode ser resolvido manualmente. Basta fazer escape doscaracteres especiais, por exemplo: ponto-e-vrgula e apstrofo. No MySQL Server, os carac-teres especiais devem ser precedidos pelo caracter \. Ento seria necessrio acrescentar \ em

    todas as ocorrncias de caracteres especiais nos valores passados pelo usurio.

    Esse processo, alm de trabalhoso, diferente para cada banco de dados, pois o \ no padronizado e cada banco tem o seu prprio mtodo de escape de caracteres especiais.

    Tornando mais prtica a comunicao com o banco de dados o prprio driver faz o trata-mento das sentenas SQL. Esse processo denominado sanitize.

    1 // pegando os dados da editora pelo teclado2 string nome = Console.ReadLine();

    3 string email = Console.ReadLine();45 // definindo a sentena SQL com parmetros6 string textoDoComando =7 @"INSERT INTO Editoras (Nome, Email) VALUES (?, ?);";89 // criando um comando odbc

    10 OdbcCommand comando = new OdbcCommand(textoDoComando, conexao);1112 // atribuindo valores aos parmetros13 comando.Parameters.AddWithValue( "@Nome", nome);14 comando.Parameters.AddWithValue( "@Email", email);

    Observe que a sentena SQL foi definida com parmetros atravs do caracter ?. Antes deexecutar o comando, necessrio atribuir valores aos parmetros. Isso feito com o mtodoAddWithValue. Esse mtodo realiza a tarefa de sanitizar os valores enviados pelo usurio.

    2.8 Exerccios

    4. Tente causar um erro de SQL Injection na classe feita no exerccio de inserir editoras.(Dica: tente entradas com aspas simples)

    5. Altere o cdigo para eliminar o problema do SQL Injection. Voc deve deixar a classecom o cdigo abaixo:

    www.k19.com.br 34

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    42/203

    ADO.NET

    1 using System;2 using System.Data.Odbc;34

    5 namespace Odbc6 {7 class InsereEditora8 {9 static void Main(string[] args)

    10 {11 string stringDeConexao = @"driver={SQL Server};12 server=MARCELO-PC\SQLEXPRESS;database=livraria;uid=sa;pwd=sa;" ;131415 Console.WriteLine("Abrindo conexao...");16 using (OdbcConnection conexao = new OdbcConnection(stringDeConexao))17 {18 string textoInsereEditora =19 "INSERT INTO Editoras (Nome, Email) Values(?, ?)";20 Console.WriteLine("Digite o nome da Editora:");

    21 string nome = Console.ReadLine();22 Console.WriteLine("Digite o email da Editora:");23 string email = Console.ReadLine();24 OdbcCommand command = new OdbcCommand(textoInsereEditora, conexao);25 command.Parameters.AddWithValue( "@Nome", nome);26 command.Parameters.AddWithValue( "@Email", email);27 conexao.Open();28 command.ExecuteNonQuery();2930 // A Conexao eh automaticamente fechada31 // ao final do bloco Using.32 }33 }34 }35 }

    6. Agora tente causar novamente o problema de SQL Injection ao inserir novas editoras.

    2.9 Listando registros

    Depois de inserir alguns registros, interessante consultar os dados das tabelas para conferirse a insero foi realizada com sucesso.

    O processo para executar um comando de consulta parecido com o de insero. neces-

    srio definir a sentena SQL e criar um objeto da classe OdbcCommand.

    1 // definindo a sentena SQL2 string textoDoComando = @"SELECT * FROM Editoras;";34 // criando um comando odbc5 OdbcCommand comando = new OdbcCommand(textoDoComando, conexao);

    A diferena que para executar um comando de consulta necessrio utilizar o mtodoExecuteReader ao invs do ExecuteNonQuery. Esse mtodo devolve um objeto da classeSystem.Data.Odbc.OdbcDataReader

    1 OdbcDataReader resultado = comando.ExecuteReader();

    35 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    43/203

    ADO.NET

    Os dados contidos no OdbcDataReader podem ser acessados atravs de indexers.

    1 string nome = resultado["Nome"] as string;2 string email = resultado["Email"] as string;

    O cdigo acima mostra como os campos do primeiro registro da consulta so recuperados.Agora, para recuperar os outros registros necessrio avanar o OdbcDataReader atravs domtodo Read.

    1 string nome1 = resultado["nome"] as string;2 string email1 = resultado["email"] as string;34 resultado.Read();56 string nome2 = resultado["nome"] as string;7 string email2 = resultado["email"] as string;

    O prprio mtodo Read devolve um valor booleano para indicar se o reader conseguiuavanar para o prximo registro. Quando esse mtodo devolver false significa que no h maisregistros para serem consultados.

    1 while(resultado.Read())2 {3 string nome = resultado["nome"] as string;4 string email = resultado["email"] as string;5 }

    2.10 Exerccios

    7. Insira algumas editoras utilizando a classe INSEREEDITORA que voc criou nos exerc-cios acima.

    8. Adicione uma nova classe ao projeto chamada ListaEditora. O objetivo listar as edi-toras que foram salvas no banco. Adicione o seguinte cdigo esta classe.

    www.k19.com.br 36

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    44/203

    ADO.NET

    1 using System;2 using System.Data.Odbc;34 namespace Odbc

    5 {6 class ListaEditora7 {8 static void Main(string[] args)9 {

    10 string stringDeConexao = @"driver={SQL Server};11 server=MARCELO-PC\SQLEXPRESS;database=livraria;uid=sa;pwd=sa;" ;121314 Console.WriteLine("Abrindo conexao...");15 using (OdbcConnection conexao = new OdbcConnection(stringDeConexao))16 {17 string textoListaEditora =18 "SELECT * FROM Editoras";19 OdbcCommand command = new OdbcCommand(textoListaEditora, conexao);20 conexao.Open();

    21 OdbcDataReader resultado = command.ExecuteReader();2223 while (resultado.Read())24 {25 long? id = resultado["Id"] as long?;26 string nome = resultado["Nome"] as string;27 string email = resultado["Email"] as string;28 Console.WriteLine("{0} : {1} - {2}\n",id,nome,email);29 }30 // A Conexao eh automaticamente fechada31 // ao final do bloco Using.32 }33 }34 }35 }

    2.11 Fbrica de conexes (Factory)

    Voc deve ter percebido que para cada ao executada no banco de dados, ns precisamoscriar uma conexo. Isso gera um problema relacionado string de conexo ficar armazenadaem diversos locais. Imagine que o driver do banco foi atualizado e mudamos a sua verso.Isso implicaria fazer diversas alteraes no cdigo em cada ocorrncia da string de conexo,tornando o cdigo mais suscetvel a erros e dificultando a sua manuteno.

    Para resolver esta situao, ns poderamos criar uma classe responsvel pela criao edistribuio de conexes, mantendo assim uma nica referncia para a string de conexo, equalquer alterao no modo em que nos conectamos base de dados, s implica mudanasnesta classe.

    37 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    45/203

    ADO.NET

    1 static class FabricaDeConexao2 {3 public static OdbcConnection CriaConexao()4 {

    5 string driver = @"SQL Server";6 string servidor = @"MARCELO-PC\SQLEXPRESS";7 string baseDeDados = @"livraria";8 string usuario = @"sa";9 string senha = @"sa";

    1011 StringBuilder connectionString = new StringBuilder();12 connectionString.Append("driver=");13 connectionString.Append(driver);14 connectionString.Append(";server=");15 connectionString.Append(servidor);16 connectionString.Append(";database=");17 connectionString.Append(baseDeDados);18 connectionString.Append(";uid=");19 connectionString.Append(usuario);20 connectionString.Append(";pwd=");

    21 connectionString.Append(senha);2223 return new OdbcConnection(connectionString.ToString());24 }25 }

    Agora podemos obter uma nova conexo apenas chamando FabricaDeConexao.CriaConexao().O resto do sistema no precisa mais conhecer os detalhes sobre a conexo com o banco de da-dos, diminuindo o acoplamento da aplicao.

    2.12 Exerccios

    9. Adicione uma nova classe chamada FABRICADECONEXAO e adicione o seguinte cdigo:

    www.k19.com.br 38

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    46/203

    ADO.NET

    1 using System;2 using System.Data.Odbc;3 using System.Text;4

    5 namespace Odbc6 {7 static class FabricaDeConexao8 {9 public static OdbcConnection CriaConexao()

    10 {11 string driver = @"SQL Server";12 string servidor = @"MARCELO-PC\SQLEXPRESS";13 string baseDeDados = @"livraria";14 string usuario = @"sa";15 string senha = @"sa";1617 StringBuilder connectionString = new StringBuilder();18 connectionString.Append("driver=");19 connectionString.Append(driver);20 connectionString.Append(";server=");

    21 connectionString.Append(servidor);22 connectionString.Append(";database=");23 connectionString.Append(baseDeDados);24 connectionString.Append(";uid=");25 connectionString.Append(usuario);26 connectionString.Append(";pwd=");27 connectionString.Append(senha);2829 return new OdbcConnection(connectionString.ToString());30 }31 }32 }

    10. Altere as classes INSEREEDITORA e L ISTAEDITORA para que elas utilizem a fbrica deconexo. Execute-as novamente.

    11. (Opcional) Implemente um teste que remove uma editora pelo id.

    12. (Opcional) Implemente um teste que altera os dados de uma editora pelo id.

    39 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    47/203

    ADO.NET

    www.k19.com.br 40

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    48/203

    Captulo 3

    Entity Framework 4.1

    3.1 Mltiplas sintaxes da linguagem SQL

    No captulo anterior, voc aprendeu a utilizar a especificao ODBC para fazer uma apli-cao C# interagir com um banco de dados. Essa interao realizada atravs de consultasescritas em SQL. Uma desvantagem dessa abordagem, que a sintaxe da linguagem SQL, ape-sar de parecida, pode variar conforme o banco de dados que est sendo utilizado. Desse modo,os desenvolvedores teriam que aprender as diferenas entres as sintaxes do SQL corresponden-tes aos banco de dados que ele utilizar.

    Seria bom se, ao invs de programar direcionado a um determinado banco de dados, pu-dssemos programar de uma maneira mais genrica, voltado uma interface ou especificao,

    assim poderamos escrever o cdigo independente de SQL.

    3.2 Orientao a Objetos VS Modelo Entidade Relaciona-

    mento

    Outro problema na comunicao entre uma aplicao C# e um banco de dados o conflitode paradigmas. O banco de dados organizado seguindo o modelo entidade relacionamento,enquanto as aplicaes C#, geralmente, utilizam o paradigma orientado a objetos.

    A transio de dados entre o modelo entidade relacionamento e o modelo orientado a ob-

    jetos no simples. Para realizar essa transio, necessrio definir um mapeamento entreos conceitos desses dois paradigmas. Por exemplo, classes podem ser mapeadas para tabelas,objetos para registros, atributos para campos e referncia entre objetos para chaves estrangeiras.

    3.3 Ferramentas ORM

    Para facilitar a comunicao entre aplicaes C# que seguem o modelo orientado a objetos eos banco de dados que seguem o modelo entidade relacionamento, podemos utilizar ferramen-tas que automatizam a transio de dados entre as aplicaes e os diferente bancos de dados eque so conhecidas como ferramentas de ORM (Object Relational Mapper).

    Outra consequncia, ao utilizar uma ferramenta de ORM, que no necessrio escreverconsultas em SQL, pois a prpria ferramenta gera as consultas de acordo com a sintaxe da

    41

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    49/203

    Entity Framework 4.1

    linguagem SQL correspondente ao banco que est sendo utilizado.A principal ferramenta ORM para C# o Entity Framework. Mas, existem outras que

    possuem o mesmo objetivo.

    3.4 Configurao

    Antes de comear a utilizar o Entity Framework, necessrio baixar no site a verso 4.1:(http://www.microsoft.com/downloads/details.aspx?FamilyID=b41c728e-9b4f

    3.5 Mapeamento

    Um dos principais objetivos dos frameworks ORM estabelecer o mapeamento entre osconceitos do modelo orientado a objetos e os conceitos do modelo entidade relacionamento.Este mapeamento pode ser definido atravs de xml ou de maneira mais prtica com DbContext.Quando utilizamos DbContext, evitamos a criao de extensos arquivos em xml.

    Podemos definir as seguintes entidades:

    12 public class Livro3 {4 public int LivroId { get; set; }

    5 public string Titulo { get; set; }6 public decimal Preco { get; set; }7 public Editora Editora { get; set; }8 }9

    10 public class Editora11 {12 public int EditoraId { get; set; }13 public string Nome { get; set; }14 public string Email { get; set; }15 public ICollection Livros { get; set; }16 }

    Criaremos agora uma classe para ajudar a mapear as entidades para um banco de dados. Aclasse EditoraContext deriva de DbContext que faz parte da biblioteca Code First:

    1 public class EditoraContext : DbContext2 {3 public DbSet Editoras { get; set; }4 public DbSet Livros { get; set; }5 }

    Utilizamos o padro EF4 Code First para permitir a persistncia no banco de dados. Istosignifica que as propriedades Editoras e Livros sero mapeadas para tabelas com mesmo nomebanco de dados. Cada propriedade definida na entidade Livro e Editora mapeada para colu-nas das tabelas Livros e Editoras.

    Abaixo segue a definio da tabela Editoras que foi criada em nosso banco de dados:

    www.k19.com.br 42

    http://www.microsoft.com/downloads/details.aspx?FamilyID=b41c728e-9b4f-4331-a1a8-537d16c6acdfhttp://www.microsoft.com/downloads/details.aspx?FamilyID=b41c728e-9b4f-4331-a1a8-537d16c6acdf
  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    50/203

    Entity Framework 4.1

    Abaixo segue a definio da tabela Livros que foi criada em nosso banco de dados:

    Ns no precisamos configurar nada para que a persistncia e o mapeamento fossem feitoscom o EF Code First - isto ocorreu simplesmente escrevendo as trs classes acima. No necessrio nenhuma configurao a mais.

    Podemos utilizar anotaes para sobrescrever a conveno padro. Para utilizar anotaoprecisamos adicionar como refernciaEntityFramework.dll e System.ComponentModel.DataAnnotations.dllao projeto e acrescentar using para o namespace System.ComponentModel.DataAnnotations.Segue as principais anotaes:

    ColumnAttribute Define o nome e o tipo da coluna no banco de dados da propriedade mape-ada.

    1 public class Livro2 {3 public int LivroId { get; set; }4 [Column("NomeDoLivro",TypeName="varchar")]5 public string Titulo { get; set; }6 public decimal Preco { get; set; }7 public Editora Editora { get; set; }8 }

    DatabaseGeneratedAttribute Utilizado para indicar que o valor do atributo gerado pelobanco de dados. Para definir como o atributo gerado voc utiliza trs constantes doenum DatabaseGenerateOption: DatabaseGeneratedOption.Identity que define que ovalor ser definido na insero e assume que no ser mais alterado. DatabaseGenera-tedOption.Computed que lido na insero e a cada atualizao. DatabaseGenerate-dOption.None indica que o valor no ser gerado pelo banco de dados.

    ForeignKeyAttribute adicionado a propriedade para especificar a propriedade que define achave estrangeira do relacionamento.

    43 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    51/203

    Entity Framework 4.1

    12 public class Livro3 {4

    5 public int LivroId { get; set; }6 public string Titulo { get; set; }7 public decimal Preco { get; set; }8 [ForeignKey("Editora")]9 public int EditoraId { get; set; }

    10 public Editora Editora { get; set; }11 }1213 public class Editora14 {15 public int EditoraId { get; set; }16 public string Nome { get; set; }17 public string Email { get; set; }18 public ICollection Livros { get; set; }19 }

    InversePropertyAttribute Indica a propriedade que define o relacionamento. Esta anotao utilizada quando temos mltiplos relacionamentos do mesmo tipo.

    Por exemplo, suponha que tenhamos uma entidade Pessoa pode ser autor ou revisor deum livro. Uma pessoa pode ter livros publicados e livros revisados, portanto a entidadePessoa tem dois relacionamentos diferentes com a entidade Livro.

    12 public class Pessoa3 {4 public int Id { get; set; }5 public string Nome { get; set; }6 public ICollection LivrosPublicados { get; set; }7 public ICollection LivrosRevisados { get; set; }8 }9

    10 public class Livro11 {1213 public int LivroId { get; set; }14 public string Titulo { get; set; }15 public decimal Preco { get; set; }16 public Editora Editora { get; set; }

    1718 [InverseProperty("LivrosPublicados")]19 public Pessoa Autor { get; set; }2021 [InverseProperty("LivrosRevisados")]22 public Pessoa Revisor { get; set; }23 }

    KeyAttribute Define a propriedades ou propriedades que identificam uma entidade.

    Se a classe define propriedades com ID ou Id, ou nome da classe seguido por ID ou Id,

    esta propriedade tratada como chave primria por conveno.Caso contrrio, podemos definir a nossa chave primria com o KeyAttribute.

    www.k19.com.br 44

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    52/203

    Entity Framework 4.1

    12 public class Pessoa3 {4 [Key]

    5 public int Identificador { get; set; }6 public string Nome { get; set; }7 public ICollection LivrosPublicados { get; set; }8 public ICollection LivrosRevisados { get; set; }9 }

    MaxLengthAttribute Define o tamanho mximo permitido para um array ou string.

    MinLengthAttribute Define o tamanho mnimo permitido para um array ou string.

    1 public class Pessoa2 {34 public int Id { get; set; }5 [MinLength(10,ErrorMessage="Tamanho minimo: 10")]6 [MaxLength(255,ErrorMessage="Tamanho mximo: 255")]7 public string Nome { get; set; }8 public ICollection LivrosPublicados { get; set; }9 public ICollection LivrosRevisados { get; set; }

    10 }

    StringLengthAttribute Define o tamanho mnimo e mximo permitido para o campo string.

    1 public class Editora2 {3 public int EditoraId { get; set; }4 [StringLength(255,MinimumLength=10)]5 public string Nome { get; set; }6 public string Email { get; set; }7 public string ExtraInfo { get; set; }8 public ICollection Livros { get; set; }9 }

    NotMappedAttribute Pode ser aplicado em classes ou propriedades. Quando aplicado emclasses ou propriedades indica que este no ser includo no momento de definio dobanco de dados.

    12 public class Editora3 {4 public int EditoraId { get; set; }5 public string Nome { get; set; }6 public string Email { get; set; }7 [NotMapped]8 public string ExtraInfo { get; set; }9 public ICollection Livros { get; set; }

    10 }

    45 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    53/203

    Entity Framework 4.1

    RequiredAttribute Define que este campo obrigatrio. Este atributo ignorado em propri-edades do tipo collection. Quando definido numa referncia, indica que cardinalidade 1 e a propriedade da chave estrangeira no-nula.

    12 public class Editora3 {4 public int EditoraId { get; set; }5 [Required]6 public string Nome { get; set; }7 public string Email { get; set; }8 public string ExtraInfo { get; set; }9 public ICollection Livros { get; set; }

    10 }

    TableAttribute Define a tabela para o qual a classe mapeada.

    12 [Table("Livros")]3 public class Livro4 {5 public int LivroId { get; set; }6 public string Titulo { get; set; }7 public decimal Preco { get; set; }8 public Editora Editora { get; set; }9 public Pessoa Autor { get; set; }

    10 public Pessoa Revisor { get; set; }11 }

    3.6 Gerando o banco

    Uma das vantagens de utilizar o EF4 Code First, que ele capaz de gerar as tabelas dobanco para a nossa aplicao. Ele faz isso de acordo com as anotaes colocadas nas classes eas informaes presentes no DBCONTEXT.

    As tabelas so geradas quando criamos uma instncia de DbContext() e o contexto necessitafazer alguma requisio ao banco de dados. Por exemplo, quando adicionamos uma entidadeao contexto.

    12 EditoraContext context = new EditoraContext();3 // Neste momento ser criado o banco de dados, caso no exista4 context.Editoras.Add(new Editora{ Nome = "Abril" });

    A poltica de criao das tabelas pode ser alterada atravs do mtodo de classe (esttico)System.Data.Entity.Database.SetInitializer . Neste mtodo devemos passar ins-tncias do tipo System.Data.Entity.IDatabaseInitializer. No EF 4.1 temos 3 classes que defi-nem estratgias para criao do banco de dados: DropCreateDatabaseAlways criar o bancode dados a cada instncia criada do contexto, ideal para ambiente de testes. CreateDataba-seIfNotExists somente criar o banco de dados, caso ele no exista, este a estratgia padro.

    www.k19.com.br 46

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    54/203

    Entity Framework 4.1

    DropCreateDatabaseIfModelChanges somente criar o banco de dados caso ele no existaou caso haja alguma alterao nas suas entidades.

    1 //Alterando a estratgia padro2 Database.SetInitializer( new DropCreateDatabaseIfModelChanges());34 EditoraContext context = new EditoraContext();5 // Neste momento ser criado o banco de dados, caso no exista6 context.Editoras.Add(new Editora{ Nome = "Abril" });

    3.7 Exerccios

    1. Crie um projeto do tipo Console Application no Microsoft Visual C# Express, chamadoEF4-Code-First.

    2. Adicione as seguintes dlls ao projeto: EntityFramework.dll e System.ComponentModel.DataAnnotation

    47 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    55/203

    Entity Framework 4.1

    www.k19.com.br 48

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    56/203

    Entity Framework 4.1

    3. Defina uma classe Editora conforme cdigo abaixo:

    12 namespace EF4_Code_First

    3 {4 public class Editora5 {6 public int Id { get; set; }7 public string Nome { get; set; }8 public string Email { get; set; }9

    10 }11 }

    4. Defina uma classe EditoraContextque derivada de DbContext. Nesta classe defina umapropriedade Editoras do tipo genrico DbSet.

    49 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    57/203

    Entity Framework 4.1

    12 using System.Data.Entity;34 namespace EF4_Code_First

    5 {6 public class EditoraContext : DbContext7 {8 public DbSet Editoras { get; set; }9 }

    10 }

    5. Defina uma classe GeraTabelas conforme cdigo abaixo:

    12 namespace EF4_Code_First

    3 {4 class GeraTabelas5 {6 static void Main(string[] args)7 {8 using (var context = new EditoraContext())9 {

    10 // Neste momento as tabelas so geradas11 context.Editoras.Add(new Editora { Nome = "Abril", Email = "abril@email

    .com" });12 }13 }14 }15 }

    Atravs do SQL Server Management Express verifique se a tabela EDITORAS foi criadacorretamente.

    3.8 Sobrescrevendo o nome do Banco de Dados

    Quando executamos a aplicao, o EF4_Code_First.EditoraContext foi criado. Uma ma-neira de sobrescrever a conveno do Code First para nome de banco de dados adicionarum arquivo App.config ou Web.config que contenha a string de conexo juntamente com aclasse do contexto. O arquivo .config pode ser acrescentado no projeto que contm o assemblytambm. Para adicionar o App.config ao projeto pelo Microsoft Visual C# Express basta clicarcom o boto direito do mouse no projeto e clicar em Add, posteriormente escolher ApplicationConfiguration File. Acrescente o connectionStrings ao seu arquivo:

    12 3 7

    Quando a aplicao for executada, o banco de dados livraria ser criado. Devemos habilitara opo MultipleActiveResultSets=True para permitir a leitura de objetos relacionados em

    www.k19.com.br 50

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    58/203

    Entity Framework 4.1

    blocos foreach do C#, pois o EF tenta criar um novo leitor de dados e ocorrer uma falha deexecuo a menos que a opo MultipleActiveResultSets seja true. Uma outra maneira de fazera leitura dos objetos relacionados dentro do bloco foreach atravs de uma List, que fecha o

    leitor de dados e permite voc percorrer a coleo e acessar os objetos relacionados.

    3.9 Exerccios

    6. Remova o banco de dados EF4_Code_First.EditoraContext.

    7. Sobrescreva a conveno do Code First para nome de banco de dados. Para isto acres-cente ao projeto EF4-Code-First o arquivo App.config com a definio da string deconexo.

    3.10 Manipulando entidades

    Para manipular as entidades da nossa aplicao, devemos utilizar uma classe derivada deDBCONTEXT.

    12 var context = new EditoraContext();

    3.10.1 Persistindo

    Para armazenar as informaes de um objeto no banco de dados basta utilizar o mtodo SA-VECHANGES() do DBCONTEXT. As entidades com o estado Added so inseridas no banco dedados quando o mtodo SAVECHANGES() chamado. Utilize o mtodo System.Data.Entity.DbSet.Add.O mtodo Addadiciona a entidade ao contexto com o estado Added.

    1 using (var context = new EditoraContext())2 {3 Editora editora = new Editora { Nome = "Abril", Email = "[email protected]" };4 //Adiciona o estado Added

    5context.Editoras.Add(editora);

    6 context.SaveChanges();78 }//fecha o contexto ao final

    3.10.2 Buscando

    Para obter um objeto que contenha informaes do banco de dados basta utilizar o mtodoFind do DBSET.

    1 Editora editora = context.Editoras.Find(1);

    51 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    59/203

    Entity Framework 4.1

    3.10.3 Removendo

    As entidades com o estado Deleted so removidas do banco de dados quando o mtodo

    SAVECHANGES() chamado. Utilize o mtodo System.Data.Entity.DbSet.Remove . O mtodoRemove remove a entidade do contexto e adiciona a entidade o estado Deleted.

    1 Editora editora = context.Editoras.Find(1);2 context.Editoras.Remove(editora);3 context.SaveChanges();

    3.10.4 Atualizando

    Para alterar os dados de um registro correspondente a um objeto basta utilizar as propri-edades. Quando as propriedades de uma entidade do contexto alterada, o estado Modified adicionado a esta entidade. Entidades com o estado Modified so atualizados no banco dedados quando o mtodo SaveChanes chamado.

    1 Editora editora = context.Editoras.Find(1);2 editora.Nome = "Abril S/A";3 context.SaveChanges();

    3.10.5 Listando

    Para obter uma listagem com todos os objetos referentes aos registros de uma tabela, pode-mos utilizar o Language Integrated Query LINQ, que permite os desenvolvedores escreverema consulta em C#.

    1 var consulta = from e in context.Editoras

    2 where e.Nome.Contains("A")3 select e;4 // Equivalente a: SELECT * FROM Editoras e where e.Nome Like A%5 foreach (var item in consulta)6 {7 System.Console.WriteLine("Editora: " + item.Nome);8 }

    3.11 Exerccios

    8. Crie um teste para inserir editoras no banco de dados.

    www.k19.com.br 52

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    60/203

    Entity Framework 4.1

    1 using System;23 namespace EF4_Code_First4 {

    5 class InsereEditoraComEF6 {7 static void Main(string[] args)8 {9 using (var context = new EditoraContext())

    10 {11 Editora editora = new Editora();12 Console.WriteLine("Digite o nome da Editora:");13 editora.Nome = Console.ReadLine();14 Console.WriteLine("Digite o email da Editora:");15 editora.Email = Console.ReadLine();16 //Adiciona editora ao contexto17 //Status: Added18 context.Editoras.Add(editora);1920 //Persisto editora

    21 context.SaveChanges();22 }23 }24 }25 }

    9. Crie um teste para listar as editoras inseridas no banco de dados.

    1 using System;2 using System.Linq;3

    4 namespace EF4_Code_First5 {6 class ListaEditoraComEF7 {8 static void Main(string[] args)9 {

    10 using (EditoraContext context = new EditoraContext())11 {12 var consulta = from e in context.Editoras13 select e;14 foreach (var item in consulta)15 {16 Console.WriteLine("{0}: {1} - {2}", item.Id,item.Nome,item.Email);17 }18 }19 }20 }21 }

    3.12 Repository

    A classe DBCONTEXT e DBSET do EF oferece recursos suficientes para que os objetosdo domnio sejam recuperados ou persistidos no banco de dados. Porm, em aplicaes comalta complexidade e grande quantidade de cdigo, espalhar as chamadas aos mtodos doDBCONTEXT e DBSET pode gerar dificuldades na manuteno e no entendimento do sistema.

    Para melhorar a organizao das nossas aplicaes, diminuindo o custo de manuteno eaumentando a legibilidade do cdigo, podemos aplicar o padro Repository do DDD(Domain

    53 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    61/203

    Entity Framework 4.1

    Driven Design).Conceitualmente, um repositrio representa o conjunto de todos os objetos de um determi-

    nado tipo. Ele deve oferecer mtodos para recuperar e para adicionar elementos.

    Os repositrios podem trabalhar com objetos prontos na memria ou reconstru-los comdados obtidos de um banco de dados. O acesso ao banco de dados pode ser realizado atravsde ferramenta ORM como o Entity Framework.

    1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Data.Entity;56 namespace EF4_Code_First7 {8 public class EditoraRepository9 {

    10 DbContext context;1112 public EditoraRepository(DbContext context)13 {14 this.context = context;15 }1617 public void Adiciona(Editora e)18 {19 context.Set().Add(e);20 context.SaveChanges();21 }2223 public Editora Busca(int id)24 {25 return context.Set().Find(id);26 }2728 public List BuscaTodas()29 {30 var consulta = from e in context.Set()31 select e;32 return consulta.ToList();33 }3435 }36 }

    1 Database.SetInitializer( new DropCreateDatabaseIfModelChanges());

    23 var context = new EditoraContext();45 EditoraRepository repository = new EditoraRepository(context);67 List editoras = repository.BuscaTodas();

    3.13 Exerccios

    10. Implemente um repositrio de editoras criando uma nova classe no projeto EF4-Code-First.

    www.k19.com.br 54

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    62/203

    Entity Framework 4.1

    1 public class EditoraRepository2 {3 DbContext context;4

    5 public EditoraRepository(DbContext context)6 {7 this.context = context;8 }9

    10 public void Adiciona(Editora e)11 {12 context.Set().Add(e);13 context.SaveChanges();14 }1516 public Editora Busca(int id)17 {18 return context.Set().Find(id);19 }20

    21 public List BuscaTodas()22 {23 var consulta = from e in context.Set()24 select e;25 return consulta.ToList();26 }2728 }

    11. Altere a classe InsereEditoraComEF para que ela utilize o repositrio de editoras.

    1 using System;23 namespace EF4_Code_First4 {5 class InsereEditoraComEF6 {7 static void Main(string[] args)8 {9 var context = new EditoraContext();

    10 EditoraRepository repository = new EditoraRepository(context);1112 Editora editora = new Editora();13 Console.WriteLine("Digite o nome da Editora:");14 editora.Nome = Console.ReadLine();15 Console.WriteLine("Digite o email da Editora:");16 editora.Email = Console.ReadLine();

    1718 repository.Adiciona(editora);1920 }21 }22 }

    12. (Opcional) Altere a classe ListaEditoraComEF para que ela utilize o repositrio deeditoras.

    55 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    63/203

    Entity Framework 4.1

    www.k19.com.br 56

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    64/203

    Captulo 4

    Viso Geral do ASP .NET MVC

    4.1 Necessidades de uma aplicao web

    As aplicaes web so acessadas pelos navegadores (browsers). A comunicao entre osnavegadores e as aplicaes web realizada atravs de requisies e respostas definidas peloprotocolo HTTP. Portando, ao desenvolver uma aplicao web, devemos estar preparados parareceber requisies HTTP e enviar respostas HTTP.

    Alm disso, na grande maioria dos casos, as aplicaes web devem ser acessadas por diver-sos usurios simultaneamente. Dessa forma, o desenvolvedor web precisa saber como permitiro acesso simultneo.

    Outra necessidade das aplicaes web gerar contedo dinmico. Por exemplo, quandoum usurio de uma aplicao de email acessa a sua caixa de entrada, ele deseja ver a listagematualizada dos seus emails. Portanto, fundamental que a listagem dos emails seja gerada nomomento da requisio do usurio. O desenvolvedor web precisa utilizar algum mecanismoeficiente que permita que o contedo que os usurios requisitam seja gerado dinamicamente.

    Trabalhar diretamente com as requisies e repostas HTTP e criar um mecanismo eficientepara permitir o acesso simultneo e para gerar contedo dinmico no so tarefas simples. Naverdade, extremamente trabalhoso implementar essas caractersticas. Por isso, a plataforma.NET oferece uma soluo para diminuir o trabalho no desenvolvimento de aplicaes web.

    4.2 Viso Geral do ASP .NET MVC

    O ASP .NET MVC oferece muitos recursos para o desenvolvimento de uma aplicao web.NET. Cada um desses recursos por si s j so suficientemente grandes e podem ser abordadosem separado.

    Porm, no primeiro contato com ASP .NET MVC, interessante ter uma viso geral dosrecursos principais e do relacionamento entre eles sem se aprofundar em muito nos detalhesindividuais de cada recurso.

    Portanto, neste captulo, mostraremos de forma sucinta e direta o funcionamento e os con-ceitos principais do ASP .NET MVC. Nos prximos captulos, discutiremos de maneira maisdetalhada as diversas partes do ASP .NET MVC.

    57

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    65/203

    Viso Geral do ASP .NET MVC

    4.3 Aplicao de exemplo

    O primeiro passo para construir uma aplicao web utilizando ASP .NET MVC criar umprojeto no Visual Web Developer a partir do modelo adequado. No nosso caso, o modelo deprojeto que deve ser utilizado o ASP.NET MVC 3 Web Application.

    Devemos escolher Empty Projectconforme figura abaixo:

    O projeto criado j vem com diversas pastas e arquivos. Ao longo dos prximos captulos,a funo de cada pasta e de cada arquivo ser discutida.

    www.k19.com.br 58

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    66/203

    Viso Geral do ASP .NET MVC

    4.3.1 Testando a aplicao

    Para verificar o funcionamento do projeto, basta execut-lo atravs do menu: Debug ->

    Start Debugging. Automaticamente um servidor de desenvolvimento inicializado na mquinae a aplicao implantada nesse servidor. Alm disso, uma janela do navegador padro dosistema aberta na url principal da aplicao.

    O servidor pode ser finalizado atravs do cone ASP.NET Development Server que fica nabarra de tarefas do Windows.

    4.3.2 Trocando a porta do servidor

    Para trocar a porta utilizada pelo servidor de desenvolvimento que o Visual Web Developer

    utiliza, basta alterar as propriedades do projeto clicando com o boto direito do mouse noprojeto e escolhendo o item properties e depois a aba web.

    4.4 Pgina de Saudao

    Comearemos o desenvolvimento da nossa livraria virtual criando uma pgina de saudao.Essa pgina deve conter uma mensagem diferente de acordo com o horrio atual.

    Para implementar a pgina de saudao, devemos criar um Controlador que receber asrequisies vindas do navegador do usurio e devolver um hipertexto XHTML gerado dina-

    micamente.A base de todos os controladores System.Web.Mvc.ControllerBase . A implementa-

    o padro desta classe abstrata System.Web.Mvc.Controller. Para criar nosso controlador,devemos criar uma classe que seja filha de System.Web.Mvc.Controller e o nome obrigatori-amente deve conter o sufixo Controller.

    1 // LivrariaVirtual/Controllers/SaudacaoController.cs2 using System;3 using System.Web.Mvc;4 using System.Web.Routing;56 namespace LivrariaVirtual.Controllers

    7 {8 public class SaudacaoController : Controller9 {

    10 public string Index()11 {12 return "Welcome to ASP.NET MVC!";13 }14 }15 }

    Por padro, a url que deve ser utilizada para enviar uma requisio a um controlador a concatenao da url principal da aplicao seguido do nome do controlador (ex: http://localhost/Saudacao).

    Por conveno, o arquivo cs contendo o cdigo da classe do controlador deve ser colocadona pasta Controllers.

    59 K19 Treinamentos

    http://localhost/Saudacaohttp://localhost/Saudacaohttp://localhost/Saudacaohttp://localhost/Saudacao
  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    67/203

    Viso Geral do ASP .NET MVC

    4.5 Exerccios

    1. Crie um projeto do tipo ASP.NET MVC 3 Web Application chamado LivrariaVirtual.

    Crie um Empty Project.

    2. Implemente uma pgina de saudao criando uma classe dentro da pasta Controllerschamada SaudacaoController.

    1 using System.Web.Mvc;23 namespace LivrariaVirtual.Controllers4 {5 public class SaudacaoController : Controller6 {7 //

    8 // GET: /Saudacao/9

    10 public string Index()11 {12 return "Welcome to ASP.NET MVC!";13 }1415 }16 }

    4.6 Alterando a pgina inicial

    Por padro, as requisies direcionadas a url principal da aplicao so enviadas ao contro-lador Home. Podemos alterar esse comportamento, modificando o arquivo de rotas da aplica-o, o Global.asax. Este cdigo:

    1 new { controller = "Home", action = "Index", id = UrlParameter.Optional }

    Deve ser substitudo por este:

    1 new { controller = "Saudacao", action = "Index", id = UrlParameter.Optional }

    4.7 Exerccios

    3. Altere a pgina inicial da nossa aplicao para a pgina de saudao criada no exerccioanterior.

    4.8 Integrando o Banco de Dados

    A nossa aplicao web vai interagir com o banco de dados para recuperar ou armazenarinformao. Vimos que a comunicao com uma base de dados pode ser encapsulada atravs

    www.k19.com.br 60

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    68/203

    Viso Geral do ASP .NET MVC

    do padro Repository. Os Repositorys e as classes que representam as entidades do sistema dalivraria virtual devem ser colocadas na pasta Models do projeto web.

    4.9 Exerccios

    4. Copie as classes Repository e as classes de entidades implementadas no captulo ADO.NETpara a pasta Models da nossa aplicao web. Coloque cada classe separada em um ar-quivo com o mesmo nome da classe.

    12 using System.Collections.Generic;34 namespace LivrariaVirtual.Models5 {6 public class Editora7 {8 public int Id { get; set; }9 public string Nome { get; set; }

    10 public string Email { get; set; }11 public virtual ICollection Livros { get; set; }12 }13 }

    12 namespace LivrariaVirtual.Models3 {4 public class Livro5 {6 public int Id { get; set; }7 public string Titulo { get; set; }8 public decimal Preco { get; set; }9 public int EditoraId { get; set; }

    10 public virtual Editora Editora { get; set; }11 }

    12 }

    12 using System.Data.Entity;34 namespace LivrariaVirtual.Models5 {6 public class LivrariaVirtualContext : DbContext7 {8 public DbSet Editoras { get; set; }

    9 public DbSet Livros { get; set; }10 }11 }

    61 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    69/203

    Viso Geral do ASP .NET MVC

    12 using System.Collections.Generic;3 using System.Linq;4

    5 namespace LivrariaVirtual.Models6 {7 public class LivroRepository8 {9 private LivrariaVirtualContext context = new LivrariaVirtualContext();

    1011 public void Adiciona(Livro e)12 {13 context.Livros.Add(e);14 context.SaveChanges();15 }1617 public Livro Busca(int id)18 {19 return context.Livros.Find(id);20 }

    2122 public List BuscaTodas()23 {24 var consulta = from e in context.Livros25 select e;26 return consulta.ToList();27 }28 }29 }

    12 using System.Collections.Generic;3 using System.Linq;45 namespace LivrariaVirtual.Models6 {7 public class EditoraRepository8 {9 private LivrariaVirtualContext context = new LivrariaVirtualContext();

    1011 public void Adiciona(Editora e)12 {13 context.Editoras.Add(e);14 context.SaveChanges();15 }1617 public Editora Busca(int id)18 {19 return context.Editoras.Find(id);20 }2122 public List BuscaTodas()23 {24 var consulta = from e in context.Editoras25 select e;26 return consulta.ToList();27 }28 }

    29 }

    www.k19.com.br 62

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    70/203

    Viso Geral do ASP .NET MVC

    4.10 Listando entidades

    Uma funcionalidade bsica que a nossa aplicao web deve oferecer para os usurios a lis-

    tagem das entidades do sistema (livro e editora). Para cada entidade, ser criado um controladorque ficar encarregado de montar a lista da entidade correspondente.

    Vamos construir um exemplo que lista as editoras a partir da URL /Editoras.

    1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Web;5 using System.Web.Mvc;6 using LivrariaVirtual.Models;78 namespace LivrariaVirtual.Controllers9 {

    10 public class EditorasController : Controller11 {12 //13 // GET: /Editoras/1415 public ActionResult Index()16 {17 var editoraRepository = new EditoraRepository();1819 return View(editoraRepository.BuscaTodas());20 }2122 }23 }

    Repare que o controlador responsvel pela lista de editoras interage com o repository deEditora. Alm disso, ele envia uma lista de editoras para a pgina atravs do mtodo View.

    Para listar as editoras que foram passados como parmetro pelo EditorasController de-vemos criar uma pgina com o mesmo nome da action Index. Alm disso, esta pgina deveser criada, por conveno, dentro de uma pasta Editoras, pasta com o mesmo nome do nossocontroller sem o sufixo Controller, dentro da pasta Views.

    63 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    71/203

    Viso Geral do ASP .NET MVC

    www.k19.com.br 64

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    72/203

    Viso Geral do ASP .NET MVC

    12 @model IList34 @{

    5 ViewBag.Title = "Editoras";6 }78 Editoras9

    10 11 12 13 Nome14 15 16 Email17 18 19 20

    21 @foreach (var item in Model) {22 23 24 @Html.DisplayFor(modelItem => item.Nome)25 26 27 @Html.DisplayFor(modelItem => item.Email)28 29 30 @Html.ActionLink("Edit", "Edit", new { id=item.Id })31 32 33 }3435

    Para gerar o contedo dinmico de nossa pgina, estamos utilizando Razor que permiteacrescentar cdigo de servidor juntamente com cdigo HTML de forma mais clara e concisa.No ASP .NET MVC temos os Helpers que so classes que facilitam a criao de uma pginae renderizao de elementos HTML. Na nossa pgina Index estamos utilizando a propriedadeHtml que uma instncia da classe System.Web.Mvc.HtmlHelper que prov mtodos pararenderizar elementos como input, select, anchor, form. Veremos com mais detalhes os Helperse Razor nos captulos posteriores.

    4.11 Exerccios

    5. Implemente um controlador chamado EditorasController para que liste todas as editorasexistentes na base de dados quando a url /Editoras for requisitada.

    6. Implemente um controlador chamado LivrosController para que liste todas as editorasexistentes na base de dados quando a url /Livros for requisitada.

    4.12 Inserindo entidades

    Outra funcionalidade fundamental que a aplicao web deve oferecer aos usurios o ca-dastro de editoras e livros. O primeiro passo, para implementar essa funcionalidade, criar um

    65 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    73/203

    Viso Geral do ASP .NET MVC

    formulrio de cadastro de editora e outro de livro. Por exemplo, suponha que para criar umaeditora devemos acessar a url /Editoras/Create. Primeiro devemos criar uma mtodo para actionCreate no nosso controlador EditorasController que redirecionar para a pgina que contm o

    formulrio, quando acessarmos a url /Editoras/Create pelo browser atravs de requisio GET.Por conveno, o nome do mtodo o mesmo nome da action.

    1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Web;5 using System.Web.Mvc;6 using LivrariaVirtual.Models;78 namespace LivrariaVirtual.Controllers9 {

    10 public class EditorasController : Controller11 {12 //13 // GET: /Editoras/1415 public ActionResult Index()16 {17 var editoraRepository = new EditoraRepository();1819 return View(editoraRepository.BuscaTodas());20 }2122 //23 // GET: /Editoras/Create2425 public ActionResult Create()26 {27 return View();28 }2930 }

    31 }

    Devemos agora criar a pgina que contm o formulrio para inserir uma editora. Por padro,esta pgina dever ser criada na pasta View/Editoras com o mesmo nome da action, portantodeveremos ter um arquivo com o nome Create.cshtml.

    www.k19.com.br 66

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    74/203

    Viso Geral do ASP .NET MVC

    1 @model LivrariaVirtual.Models.Editora23 @{4 ViewBag.Title = "Create";

    5 }67 Create8 @using (@Html.BeginForm())9 {

    10 11 Editora1213 14 @Html.LabelFor(model => model.Nome)15 16 17 @Html.EditorFor(model => model.Nome)18 1920

    21 @Html.LabelFor(model => model.Email)22 23 24 @Html.EditorFor(model => model.Email)25 2627

    28 29

    30 31 }

    Quando o usurio clicar no boto "submit", uma action dever receber a requisio comos dados preenchidos no formulrio pelo usurio. Os dados sero enviados atravs de umarequisio POST, por padro , e deveremos ter uma action Create que receber os dados deuma requisio POST. Por conveno, deveremos ter no nosso controlador um mtodo com omesmo nome da action e restringiremos o mtodo para tratar somente requisies POST coma anotao HttpPost. Neste mtodo faremos a insero da editora atravs da classe Editora-Repository.

    67 K19 Treinamentos

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    75/203

    Viso Geral do ASP .NET MVC

    1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Web;

    5 using System.Web.Mvc;6 using LivrariaVirtual.Models;78 namespace LivrariaVirtual.Controllers9 {

    10 public class EditorasController : Controller11 {12 private EditoraRepository editoraRepository = new EditoraRepository();13 //14 // GET: /Editoras/1516 public ActionResult Index()17 {18 return View(this.editoraRepository.BuscaTodas());19 }20

    21 //22 // GET: /Editoras/Create2324 public ActionResult Create()25 {26 return View();27 }2829 //30 // POST: /Editoras/Create3132 [HttpPost]33 public ActionResult Create(Editora editora)34 {3536 editoraRepository.Adiciona(editora);37 return RedirectToAction("Index");3839 }4041 }42 }

    4.13 Exerccios

    7. Crie um mtodo para action Create no nosso controlador EditorasController respons-vel por apresentar um formulrio de cadastramento de editoras. Este formulrio deverser acessado atravs de uma URL /Editoras/Create. Ao enviar os dados do formulriopara o servidor atravs de uma requisio POST, defina um mtodo para esta action quereceba estes dados enviados pelo usurio e salve na base de dados utilizando a nossaclasse EditoraRepository.

    8. Crie um mtodo para action Create no nosso controlador LivrosController responsvelpor apresentar um formulrio de cadastramento de livros. Este formulrio dever seracessado atravs de uma URL /Livros/Create. Ao enviar os dados do formulrio para oservidor atravs de uma requisio POST, defina um mtodo para esta action que recebaestes dados enviados pelo usurio e salve na base de dados utilizando a nossa classeLivroRepository.

    www.k19.com.br 68

  • 7/30/2019 GeovaneMaciel Apresenta Desenvolvimento Web Com ASP.net Mvc

    76/203

    Viso Geral do ASP .NET MVC

    Devemos permitir que o usurio possa definir a editora a qual o livro pertence. Paraisto, devemos ter uma caixa de seleo com todas as editoras da nossa base de dados.Antes de criar a caixa de seleo, devemos enviar uma lista para a nossa View, atravs

    da propriedade ViewBag, com todas as editoras da nossa base de dados.

    12 using System;3 using System.Collections.Generic;4 using System.Data;5 using System.Data.Entity;6 using System.Linq;7 using System.Web;8 using System.Web.Mvc;9 using LivrariaVirtual.Models;

    1011 namespace LivrariaVirtual.Controllers12 {13 public class LivrosController : Controller14 {15 private LivroRe