Download - k19 k32 to Web Com ASP.net Mvc

Transcript

TREINAMENTOS

Desenvolvimento Web com ASP.NET MVC 3

Desenvolvimento Web com ASP.NET MVC

22 de junho de 2011

www.k19.com.br

ii

Sumrio1 Banco de dados 1.1 Sistemas gerenciadores de banco de dados . . . . . . . . . 1.2 SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Bases de dados (Databases) . . . . . . . . . . . . . . . . 1.3.1 Criando uma base de dados no SQL Server Express 1.4 Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.1 Criando tabelas no SQL Server Express . . . . . . 1.5 Operaes Bsicas . . . . . . . . . . . . . . . . . . . . . 1.6 Chaves Primria e Estrangeira . . . . . . . . . . . . . . . 1.7 Consultas Avanadas . . . . . . . . . . . . . . . . . . . . 1.8 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . ADO.NET 2.1 Driver . . . . . . . . . . . . . 2.2 ODBC . . . . . . . . . . . . . 2.3 ODBC Manager . . . . . . . . 2.4 Criando uma conexo . . . . . 2.5 Inserindo registros . . . . . . 2.6 Exerccios . . . . . . . . . . . 2.7 SQL Injection . . . . . . . . . 2.8 Exerccios . . . . . . . . . . . 2.9 Listando registros . . . . . . . 2.10 Exerccios . . . . . . . . . . . 2.11 Fbrica de conexes (Factory) 2.12 Exerccios . . . . . . . . . . . 1 1 2 2 2 4 5 8 10 11 11 29 29 30 30 31 32 32 33 34 35 36 37 38 41 41 41 41 42 42 46 47 50 51

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

2

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

3

Entity Framework 4.1 3.1 Mltiplas sintaxes da linguagem SQL . . . . . . . . . . . 3.2 Orientao a Objetos VS Modelo Entidade Relacionamento 3.3 Ferramentas ORM . . . . . . . . . . . . . . . . . . . . . 3.4 Congurao . . . . . . . . . . . . . . . . . . . . . . . . 3.5 Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . 3.6 Gerando o banco . . . . . . . . . . . . . . . . . . . . . . 3.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . 3.8 Sobrescrevendo o nome do Banco de Dados . . . . . . . . 3.9 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . iii

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

SUMRIO 3.10 Manipulando entidades 3.10.1 Persistindo . . 3.10.2 Buscando . . . 3.10.3 Removendo . . 3.10.4 Atualizando . . 3.10.5 Listando . . . 3.11 Exerccios . . . . . . . 3.12 Repository . . . . . . . 3.13 Exerccios . . . . . . . 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

SUMRIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 51 51 52 52 52 52 53 54 57 57 57 58 59 59 59 60 60 60 60 61 63 65 65 68 70 74 75 77 80 81 82 83 83 84 84 86 87 87 89 91 93 94 iv

Viso Geral do ASP .NET MVC 4.1 Necessidades de uma aplicao web 4.2 Viso Geral do ASP .NET MVC . . 4.3 Aplicao de exemplo . . . . . . . . 4.3.1 Testando a aplicao . . . . 4.3.2 Trocando a porta do servidor 4.4 Pgina de Saudao . . . . . . . . . 4.5 Exerccios . . . . . . . . . . . . . . 4.6 Alterando a pgina inicial . . . . . . 4.7 Exerccios . . . . . . . . . . . . . . 4.8 Integrando o Banco de Dados . . . . 4.9 Exerccios . . . . . . . . . . . . . . 4.10 Listando entidades . . . . . . . . . 4.11 Exerccios . . . . . . . . . . . . . . 4.12 Inserindo entidades . . . . . . . . . 4.13 Exerccios . . . . . . . . . . . . . . 4.14 Alterando entidades . . . . . . . . . 4.14.1 Link de alterao . . . . . . 4.15 Exerccios . . . . . . . . . . . . . . 4.16 Removendo entidades . . . . . . . . 4.17 Exerccios . . . . . . . . . . . . . . Tratamento de Erros 5.1 Try-Catch . . . . 5.2 Exerccios . . . . 5.3 Custom Errors . . 5.4 Exerccios . . . . 5.5 Erros do HTTP . 5.6 Exerccios . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

5

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

6

Camada de Apresentao (View) 6.1 Inline Code . . . . . . . . . 6.2 Utilizando Inline Code . . . 6.3 ViewData, ViewBag e Model 6.4 HTML Helpers . . . . . . . 6.4.1 ActionLink Helper .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

www.k19.com.br

SUMRIO 6.4.2 Helpers de Formulrios 6.4.3 DropDownList Helper 6.4.4 Editor Helper . . . . . 6.5 Exerccios . . . . . . . . . . . 6.6 Master Pages . . . . . . . . . 6.6.1 Contedo comum . . . 6.6.2 Lacunas . . . . . . . . 6.7 Exerccios . . . . . . . . . . . 6.8 Importao Automtica . . . . 6.9 Exerccios . . . . . . . . . . . 6.10 Dividindo o contedo . . . . . 6.11 Exerccios . . . . . . . . . . . 7 Controle (Controller) 7.1 Actions . . . . . . . . . . 7.2 ActionResult . . . . . . . 7.3 Parmetros . . . . . . . . 7.3.1 Vrios parmetros 7.3.2 Por objeto . . . . . 7.4 Exerccios . . . . . . . . . 7.5 TempData . . . . . . . . . 7.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

SUMRIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 97 98 103 106 107 108 112 116 117 117 119 121 121 122 123 123 124 124 125 126 127 128 128 128 131 131 132 134 138 138 139 139 140 140 145 145 145 146 147 148

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

8

Rotas 8.1 Adicionando uma rota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2 Denindo parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Validao 9.1 Controller . . . . . . . . . . . 9.2 View . . . . . . . . . . . . . . 9.3 Exerccios . . . . . . . . . . . 9.4 Anotaes . . . . . . . . . . . 9.4.1 Required . . . . . . . 9.4.2 Alterando a mensagem 9.4.3 Outros validadores . . 9.5 Validao no lado do Cliente . 9.6 Exerccios . . . . . . . . . . .

9

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

10 Sesso 10.1 Sesso . . . . . . . . . . . . . . 10.1.1 Identicando o Usurio . 10.2 Utilizando Session no ASP.NET 10.3 Session Mode . . . . . . . . . . 10.4 Exerccios . . . . . . . . . . . . v

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

K19 Treinamentos

SUMRIO 11 Filtros 11.1 Filtro de Autenticao . 11.2 Exerccios . . . . . . . 11.3 Action Filters . . . . . 11.4 Exerccios . . . . . . .

SUMRIO 157 157 159 159 160 161 161 161 162 162 163 163 164 164 166 166 168 168 170 170 173 173 175 175 178 178 181 181 189 189 191 191 193 193 194 194

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

12 Projeto 12.1 Modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3 Persistncia - Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5 Persistncia - Congurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.7 Persistncia - Repositrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.8 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.8.1 Unit of Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.9 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.10Apresentao - Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.11Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.12Cadastrando e Listando Selees . . . . . . . . . . . . . . . . . . . . . . . . . 12.13Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.14Removendo Selees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.15Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.16Cadastrando, Listando e Removendo Jogadores . . . . . . . . . . . . . . . . . 12.17Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.18Removendo Jogadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.19Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.20Membership e Autorizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.21Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.21.1 Adicionando um Usurio Administrador com ASP .NET Conguration 12.22Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.22.1 Autorizao Role-based . . . . . . . . . . . . . . . . . . . . . . . . . 12.23Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.24Controle de Erro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.25Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.26Enviando email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.27Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

www.k19.com.br

vi

Captulo 1 Banco de dadosO nosso objetivo desenvolver aplicaes em C#. Essas aplicaes necessitam armazenar as informaes relacionadas ao seu domnio em algum lugar. Por exemplo, uma aplicao de gerenciamento de uma livraria deve armazenar os dados dos livros que ela comercializa. Uma forma 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 com dados: Segurana: As informaes potencialmente condenciais devem ser controladas de forma que apenas 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 forma concorrente. Apesar disso, os dados no podem ser perdidos ou corrompidos. Considerando todos esses aspectos, conclumos que seria necessria a utilizao de um sistema complexo para manusear as informaes das nossas aplicaes. Felizmente, tal tipo de sistema j existe e conhecido como Sistema Gerenciador de Banco 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

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. O SQL Server Express pode ser obtido a partir do site: http://www.microsoft.com/express/Database/.

Microsoft SQL Server Management Studio ExpressPara interagir com o SQL Server Express, utilizaremos um cliente com interface grca chamado 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 diversos sistemas ao mesmo tempo. Por exemplo, as informaes dos clientes de um banco, alm dos produtos de uma loja virtual. Caso os dados fossem mantidos sem nenhuma separao lgica, a organizao caria prejudicada. Alm disso, seria mais difcil implementar regras de segurana referentes ao acesso dos dados. Tais regras criam restries quanto ao contedo acessvel por cada usurio. Determinado 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 separadamente 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 CREATE DATABASE. www.k19.com.br 2

Banco de dados

3

K19 Treinamentos

Banco de dados

Repare que alm da base de dados livraria h outras bases. Essas bases foram criadas automaticamente pelo prprio SQL Server Express para teste ou para guardar algumas conguraes. Quando uma base de dados no mais necessria, ela pode ser removida atravs do comando DROP DATABASE.

1.4

Tabelas

Um servidor de banco de dados dividido em bases de dados com o intuito de separar as informaes de sistemas diferentes. Nessa mesma linha de raciocnio, podemos dividir os dados de uma base a m de agrup-los segundo as suas correlaes. Essa separao feita atravs de tabelas. Por exemplo, no sistema de um banco, interessante separar o saldo e o limite 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.

Nome Jos Maria

Clientes Idade Cpf 27 31875638735 32 30045667856

Numero 1 2

Contas Saldo 1000 2000

Limite 500 700 4

www.k19.com.br

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. Na criao de uma tabela necessrio denir quais so os nomes e os tipos das colunas.

5

K19 Treinamentos

Banco de dados

www.k19.com.br

6

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 ca dbo.Livros. Se uma tabela no for mais desejada ela pode ser removida atravs do comando DROP TABLE. 7 K19 Treinamentos

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. Esta linguagem 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

Banco de dados

9

K19 Treinamentos

Banco de dados

1.6

Chaves Primria e Estrangeira

Suponha que os livros da nossa livraria so separados por editoras. Uma editora possui nome 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

Banco de dados descobrir qual a editora de um determinado livro ou quais so os livros de uma determinada editora. Para isso, os registros da tabela Editoras devem estar relacionados aos da tabela Livros. Na tabela Livros, poderamos adicionar uma coluna para armazenar o nome da editora a qual ele pertence. Dessa forma, se algum quiser recuperar as informaes da editora de um determinado 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 o mesmo nome. Dessa forma, eventualmente, no conseguiramos descobrir os dados corretos da editora de um determinado livro. Para resolver esse problema, deveramos criar uma restrio na tabela Editoras que proba a insero de editoras com o mesmo nome. Para resolver esse problema no SQL Server Express, poderamos adicionar a propriedade UNIQUE 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 vnculo explcito entre as tabelas. Para solucionar estes problemas, devemos utilizar o conceito de chave primria e chave estrangeira. Toda tabela pode ter uma chave primria, que um conjunto de um ou mais campos que devem ser nicos para cada registro. Normalmente, um campo numrico escolhido para ser a chave 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 primria. Vamos chamar esse campo de Id. Na tabela Livros, podemos adicionar um campo numrico chamado EditoraId que deve ser utilizado para guardar o valor da chave primria da 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 EditoraId deve 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 denio 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 os registros de duas ou mais tabelas. Por exemplo, descobrir todos os livros de uma determinada editora.

1.8

Exerccios

1. Abra o Microsoft SQL Server Management Studio Express utilizando NOME_DA_MAQUINA SQLEXPRESS como Server Name, SQL Server Authentication como Authentication, sa como Login e sa como Password. 11 K19 Treinamentos

Banco de dados

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

www.k19.com.br

12

Banco de dados

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

Banco de dados

www.k19.com.br

14

Banco de dados

4. Crie uma tabela chamada Editoras conforme as guras abaixo. 15 K19 Treinamentos

Banco de dados

Altere os campos para torn-los obrigatrios, NO permitindo que eles quem em branco N U LL. www.k19.com.br 16

Banco de dados

Alm disso o campo Id deve ser uma chave primria. 17 K19 Treinamentos

Banco de dados

O campo Id dever ser incrementado automaticamente. Dena ele com a propriedade Identity segundo a gura abaixo: www.k19.com.br 18

Banco de dados

5. Crie uma tabela chamada Livros conforme as guras abaixo: 19 K19 Treinamentos

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 boto direito sobre a coluna EditoraId e selecione a opo Relantioships..., conforme a gura abaixo: www.k19.com.br 20

Banco de dados

Devemos acrescentar o relacionamento entre livro e editora. Clique em Add e posteriormente no boto direita na linha Tables and Columns Specication. 21 K19 Treinamentos

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 a coluna Id como a chave primria referenciada. Selecione a coluna EditoraId como a coluna que ir fazer referncia a chave primria da tabela Editoras.

6. Adicione alguns registros na tabela Editoras. Veja exemplos na gura abaixo: www.k19.com.br 22

Banco de dados

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

23

K19 Treinamentos

Banco de dados 8. Consulte os registros da tabela Editoras, e em seguida consulte a tabela Livros. Veja exemplos logo abaixo:

9. Altere alguns dos registros da tabela Livros. Veja o exemplo abaixo: www.k19.com.br 24

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

Banco de dados

12. Remova alguns registros da tabela Editoras. Preste ateno para no remover uma editora que 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 um exemplo na gura abaixo: www.k19.com.br 26

Banco de dados

27

K19 Treinamentos

Banco de dados

www.k19.com.br

28

Captulo 2 ADO.NETNo captulo anterior, aprendemos que utilizar bancos de dados uma boa soluo para o armazenamento dos dados do estoque de uma loja virtual. Entretanto, voc deve ter percebido que 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 as consultas. Alm disso, quando o volume de dados muito grande, mais difcil visualizar os resultados. Na prtica uma aplicao com interface simples desenvolvida para permitir que os usurios do sistema possam manipular os dados do banco. De alguma forma, essa aplicao precisa se 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 mensagens com o mesmo. O formato das mensagens precisa ser denido previamente. Por questes de economia de espao, cada bit de uma mensagem tem um signicado diferente. Em outras palavras, o protocolo de comunicao binrio. Mensagens denidas com protocolos binrios so facilmente interpretadas por computadores. Por outro lado, so complexas para um ser humano compreender. Dessa forma, mais trabalhoso e mais suscetvel a erro desenvolver uma aplicao que converse com um banco de dados atravs de mensagens binrias. Para resolver esse problema e facilitar o desenvolvimento de aplicaes que devem se comunicar com bancos de dados, as empresas que so proprietrias desses bancos oferecem os drivers de conexo. Os drivers de conexo atuam como tradutores de comandos escritos em uma determinada linguagem de programao para comandos no protocolo do banco de dados. Do ponto de vista do desenvolvedor da aplicao, no necessrio conhecer o complexo protocolo binrio do banco. Em alguns casos, o protocolo binrio de um determinado banco de dados fechado. Consequentemente, a nica maneira de se comunicar com o banco de dados atravs de um driver de conexo. 29

ADO.NET

2.2

ODBC

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

Para facilitar o trabalho do desenvolvedor da aplicao, a Microsoft deniu uma especicao chamada ODBC (Open Database Connectivity) para padronizar a interface dos drivers de conexo. Assim, quando uma empresa proprietria de um banco de dados pretende desenvolver um driver, ela segue essa especicao com o intuito de populariz-lo.

Os drivers de conexo que respeitam a especicao ODBC, ou seja, possuem um conjunto de 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 consigam utiliz-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 ODBC Manager do Windows. O ODBC Manager pode ser executado atravs do item Ferramentas Administrativas do Painel de Controle. www.k19.com.br 30

ADO.NET

2.4

Criando uma conexo

Com o driver de conexo ODBC instalado na mquina j possvel criar uma conexo com o banco de dados correspondente. O que necessrio para estabelecer uma conexo com o banco de dados? Escolher o driver de conexo; Denir 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 denidas na chamada string de conexo.1 2 string stringDeConexao = @"driver={SQL Server}; server=MARCELO-PC\SQLEXPRESS;database=livraria;uid=sa;pwd=sa;";

31

K19 Treinamentos

ADO.NET Aps a denio da string de conexo, podemos utilizar a classe do .NET Framework que 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 exemplo, j podemos inserir registros nas tabelas. O primeiro passo para executar um comando den-lo em linguagem SQL.1 2 string textoDoComando = @"INSERT INTO Editoras (Nome, Email) VALUES (Abril, [email protected]);";

Em seguida, devemos criar um objeto da classe System. Data.Odbc.OdbcCommand vinculado ao texto do comando e conexo previamente criada. O comando no executado quando os objetos dessa classe so instanciados.1 OdbcCommand comando = new OdbcCommand(textoDoComando, conexao);

Por m, o comando pode ser executado atravs do mtodo ExecuteNonQuery. A conexo deve ser aberta antes de executar o comando.1 2 conexao.Open(); comando.ExecuteNonQuery();

Se a aplicao mantiver as conexes abertas o banco de dados pode deixar de atender outras aplicaes pois h um limite de conexes que o banco pode suportar. Portanto, importante que 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, chamado ODBC. 2. Utilizando o projeto do exerccio anterior, faa um programa para inserir registros na tabela Editoras. www.k19.com.br 32

ADO.NET1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 using System.Data.Odbc; namespace Odbc { class InsereEditora { static void Main(string[] args) { string stringDeConexao = @"driver={SQL Server}; server=MARCELO-PC\SQLEXPRESS;database=livraria;uid=sa;pwd=sa;";

using (OdbcConnection conexao = new OdbcConnection(stringDeConexao)) { string textoInsereEditora = "INSERT INTO Editoras (Nome, Email) Values(Abril, [email protected])" ; OdbcCommand command = new OdbcCommand(textoInsereEditora, conexao); conexao.Open(); command.ExecuteNonQuery(); // A Conexao eh automaticamente fechada // ao final do bloco Using. } } } }

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 segurana e outra tcnica. A falha de segurana ocorre quando uma pessoa mal intencionada ao preencher um formulrio, digita propositalmente uma sentena em SQL que provoca um comportamento no previsto. Esse comportamento, pode por vezes, comprometer a segurana, s vezes mostrando pessoa mal intencionada informaes condenciais, em outras pode apagar informaes do banco. Esse tipo de ataque conhecido como SQL Injection.

33

K19 Treinamentos

ADO.NET O problema de SQL Injection pode ser resolvido manualmente. Basta fazer escape dos caracteres especiais, por exemplo: ponto-e-vrgula e apstrofo. No MySQL Server, os caracteres 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 tratamento das sentenas SQL. Esse processo denominado sanitize.

1 2 3 4 5 6 7 8 9 10 11 12 13 14

// pegando os dados da editora pelo teclado string nome = Console.ReadLine(); string email = Console.ReadLine(); // definindo a sentena SQL com parmetros string textoDoComando = @"INSERT INTO Editoras (Nome, Email) VALUES (?, ?);"; // criando um comando odbc OdbcCommand comando = new OdbcCommand(textoDoComando, conexao); // atribuindo valores aos parmetros comando.Parameters.AddWithValue("@Nome", nome); comando.Parameters.AddWithValue("@Email", email);

Observe que a sentena SQL foi denida com parmetros atravs do caracter ?. Antes de executar o comando, necessrio atribuir valores aos parmetros. Isso feito com o mtodo AddWithValue. 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 classe com o cdigo abaixo: www.k19.com.br 34

ADO.NET1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 using System; using System.Data.Odbc;

namespace Odbc { class InsereEditora { static void Main(string[] args) { string stringDeConexao = @"driver={SQL Server}; server=MARCELO-PC\SQLEXPRESS;database=livraria;uid=sa;pwd=sa;";

Console.WriteLine("Abrindo conexao..."); using (OdbcConnection conexao = new OdbcConnection(stringDeConexao)) { string textoInsereEditora = "INSERT INTO Editoras (Nome, Email) Values(?, ?)"; Console.WriteLine("Digite o nome da Editora:"); string nome = Console.ReadLine(); Console.WriteLine("Digite o email da Editora:"); string email = Console.ReadLine(); OdbcCommand command = new OdbcCommand(textoInsereEditora, conexao); command.Parameters.AddWithValue("@Nome", nome); command.Parameters.AddWithValue("@Email", email); conexao.Open(); command.ExecuteNonQuery(); // A Conexao eh automaticamente fechada // ao final do bloco Using. } } } }

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 conferir se a insero foi realizada com sucesso. O processo para executar um comando de consulta parecido com o de insero. necessrio denir a sentena SQL e criar um objeto da classe OdbcCommand.1 2 3 4 5 // definindo a sentena SQL string textoDoComando = @"SELECT * FROM Editoras;"; // criando um comando odbc OdbcCommand comando = new OdbcCommand(textoDoComando, conexao);

A diferena que para executar um comando de consulta necessrio utilizar o mtodo ExecuteReader ao invs do ExecuteNonQuery. Esse mtodo devolve um objeto da classe System.Data.Odbc.OdbcDataReader1 OdbcDataReader resultado = comando.ExecuteReader();

35

K19 Treinamentos

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

1 2

string nome = resultado["Nome"] as string; 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 do mtodo Read.

1 2 3 4 5 6 7

string nome1 = resultado["nome"] as string; string email1 = resultado["email"] as string; resultado.Read(); string nome2 = resultado["nome"] as string; string email2 = resultado["email"] as string;

O prprio mtodo Read devolve um valor booleano para indicar se o reader conseguiu avanar para o prximo registro. Quando esse mtodo devolver false signica que no h mais registros para serem consultados.

1 2 3 4 5

while(resultado.Read()) { string nome = resultado["nome"] as string; string email = resultado["email"] as string; }

2.10

Exerccios

7. Insira algumas editoras utilizando a classe I NSERE E DITORA que voc criou nos exerccios acima.

8. Adicione uma nova classe ao projeto chamada ListaEditora. O objetivo listar as editoras que foram salvas no banco. Adicione o seguinte cdigo esta classe. www.k19.com.br 36

ADO.NET1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 using System; using System.Data.Odbc; namespace Odbc { class ListaEditora { static void Main(string[] args) { string stringDeConexao = @"driver={SQL Server}; server=MARCELO-PC\SQLEXPRESS;database=livraria;uid=sa;pwd=sa;";

Console.WriteLine("Abrindo conexao..."); using (OdbcConnection conexao = new OdbcConnection(stringDeConexao)) { string textoListaEditora = "SELECT * FROM Editoras"; OdbcCommand command = new OdbcCommand(textoListaEditora, conexao); conexao.Open(); OdbcDataReader resultado = command.ExecuteReader(); while (resultado.Read()) { long? id = resultado["Id"] as long?; string nome = resultado["Nome"] as string; string email = resultado["Email"] as string; Console.WriteLine("{0} : {1} - {2}\n",id,nome,email); } // A Conexao eh automaticamente fechada // ao final do bloco Using. } } } }

2.11

Fbrica de conexes (Factory)

Voc deve ter percebido que para cada ao executada no banco de dados, ns precisamos criar uma conexo. Isso gera um problema relacionado string de conexo car armazenada em 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 dicultando a sua manuteno. Para resolver esta situao, ns poderamos criar uma classe responsvel pela criao e distribuio de conexes, mantendo assim uma nica referncia para a string de conexo, e qualquer alterao no modo em que nos conectamos base de dados, s implica mudanas nesta classe. 37 K19 Treinamentos

ADO.NET1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 static class FabricaDeConexao { public static OdbcConnection CriaConexao() { string driver = @"SQL Server"; string servidor = @"MARCELO-PC\SQLEXPRESS"; string baseDeDados = @"livraria"; string usuario = @"sa"; string senha = @"sa"; StringBuilder connectionString = new StringBuilder(); connectionString.Append("driver="); connectionString.Append(driver); connectionString.Append(";server="); connectionString.Append(servidor); connectionString.Append(";database="); connectionString.Append(baseDeDados); connectionString.Append(";uid="); connectionString.Append(usuario); connectionString.Append(";pwd="); connectionString.Append(senha); return new OdbcConnection(connectionString.ToString()); } }

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 dados, diminuindo o acoplamento da aplicao.

2.12

Exerccios

9. Adicione uma nova classe chamada FABRICA D E C ONEXAO e adicione o seguinte cdigo: www.k19.com.br 38

ADO.NET1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 using System; using System.Data.Odbc; using System.Text; namespace Odbc { static class FabricaDeConexao { public static OdbcConnection CriaConexao() { string driver = @"SQL Server"; string servidor = @"MARCELO-PC\SQLEXPRESS"; string baseDeDados = @"livraria"; string usuario = @"sa"; string senha = @"sa"; StringBuilder connectionString = new StringBuilder(); connectionString.Append("driver="); connectionString.Append(driver); connectionString.Append(";server="); connectionString.Append(servidor); connectionString.Append(";database="); connectionString.Append(baseDeDados); connectionString.Append(";uid="); connectionString.Append(usuario); connectionString.Append(";pwd="); connectionString.Append(senha); return new OdbcConnection(connectionString.ToString()); } } }

10. Altere as classes I NSERE E DITORA e L ISTA E DITORA para que elas utilizem a fbrica de conexo. 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

ADO.NET

www.k19.com.br

40

Captulo 3 Entity Framework 4.13.1 Mltiplas sintaxes da linguagem SQL

No captulo anterior, voc aprendeu a utilizar a especicao ODBC para fazer uma aplicao C# interagir com um banco de dados. Essa interao realizada atravs de consultas escritas em SQL. Uma desvantagem dessa abordagem, que a sintaxe da linguagem SQL, apesar 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 correspondentes aos banco de dados que ele utilizar. Seria bom se, ao invs de programar direcionado a um determinado banco de dados, pudssemos programar de uma maneira mais genrica, voltado uma interface ou especicao, assim poderamos escrever o cdigo independente de SQL.

3.2

Orientao a Objetos VS Modelo Entidade Relacionamento

Outro problema na comunicao entre uma aplicao C# e um banco de dados o conito de 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 objetos no simples. Para realizar essa transio, necessrio denir um mapeamento entre os 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 e os banco de dados que seguem o modelo entidade relacionamento, podemos utilizar ferramentas que automatizam a transio de dados entre as aplicaes e os diferente bancos de dados e que so conhecidas como ferramentas de ORM (Object Relational Mapper). Outra consequncia, ao utilizar uma ferramenta de ORM, que no necessrio escrever consultas em SQL, pois a prpria ferramenta gera as consultas de acordo com a sintaxe da 41

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

Congurao

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 os conceitos do modelo orientado a objetos e os conceitos do modelo entidade relacionamento. Este mapeamento pode ser denido atravs de xml ou de maneira mais prtica com DbContext. Quando utilizamos DbContext, evitamos a criao de extensos arquivos em xml. Podemos denir as seguintes entidades:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

public class Livro { public int LivroId { get; set; } public string Titulo { get; set; } public decimal Preco { get; set; } public Editora Editora { get; set; } } public class Editora { public int EditoraId { get; set; } public string Nome { get; set; } public string Email { get; set; } public ICollection Livros { get; set; } }

Criaremos agora uma classe para ajudar a mapear as entidades para um banco de dados. A classe EditoraContext deriva de DbContext que faz parte da biblioteca Code First:1 2 3 4 5 public class EditoraContext : DbContext { public DbSet Editoras { get; set; } public DbSet Livros { get; set; } }

Utilizamos o padro EF4 Code First para permitir a persistncia no banco de dados. Isto signica que as propriedades Editoras e Livros sero mapeadas para tabelas com mesmo nome banco de dados. Cada propriedade denida na entidade Livro e Editora mapeada para colunas das tabelas Livros e Editoras. Abaixo segue a denio da tabela Editoras que foi criada em nosso banco de dados: www.k19.com.br 42

Entity Framework 4.1

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

Ns no precisamos congurar nada para que a persistncia e o mapeamento fossem feitos com o EF Code First - isto ocorreu simplesmente escrevendo as trs classes acima. No necessrio nenhuma congurao a mais. Podemos utilizar anotaes para sobrescrever a conveno padro. Para utilizar anotao precisamos adicionar como referncia EntityFramework.dll e System.ComponentModel.DataAnnotations.dll ao projeto e acrescentar using para o namespace System.ComponentModel.DataAnnotations. Segue as principais anotaes:

ColumnAttribute Dene o nome e o tipo da coluna no banco de dados da propriedade mapeada.

1 2 3 4 5 6 7 8

public class Livro { public int LivroId { get; set; } [Column("NomeDoLivro",TypeName="varchar")] public string Titulo { get; set; } public decimal Preco { get; set; } public Editora Editora { get; set; } }

DatabaseGeneratedAttribute Utilizado para indicar que o valor do atributo gerado pelo banco de dados. Para denir como o atributo gerado voc utiliza trs constantes do enum DatabaseGenerateOption: DatabaseGeneratedOption.Identity que dene que o valor ser denido na insero e assume que no ser mais alterado. DatabaseGeneratedOption.Computed que lido na insero e a cada atualizao. DatabaseGeneratedOption.None indica que o valor no ser gerado pelo banco de dados.

ForeignKeyAttribute adicionado a propriedade para especicar a propriedade que dene a chave estrangeira do relacionamento. 43 K19 Treinamentos

Entity Framework 4.11 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

public class Livro { public int LivroId { get; set; } public string Titulo { get; set; } public decimal Preco { get; set; } [ForeignKey("Editora")] public int EditoraId { get; set; } public Editora Editora { get; set; } } public class Editora { public int EditoraId { get; set; } public string Nome { get; set; } public string Email { get; set; } public ICollection Livros { get; set; } }

InversePropertyAttribute Indica a propriedade que dene 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 de um livro. Uma pessoa pode ter livros publicados e livros revisados, portanto a entidade Pessoa tem dois relacionamentos diferentes com a entidade Livro.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

public class Pessoa { public int Id { get; set; public string Nome { get; public ICollection public ICollection } public class Livro { public public public public

} set; } LivrosPublicados { get; set; } LivrosRevisados { get; set; }

int LivroId { get; set; } string Titulo { get; set; } decimal Preco { get; set; } Editora Editora { get; set; }

[InverseProperty("LivrosPublicados")] public Pessoa Autor { get; set; } [InverseProperty("LivrosRevisados")] public Pessoa Revisor { get; set; } }

KeyAttribute Dene a propriedades ou propriedades que identicam uma entidade. Se a classe dene 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 denir a nossa chave primria com o KeyAttribute. www.k19.com.br 44

Entity Framework 4.11 2 3 4 5 6 7 8 9

public class Pessoa { [Key] public int Identificador { get; set; } public string Nome { get; set; } public ICollection LivrosPublicados { get; set; } public ICollection LivrosRevisados { get; set; } }

MaxLengthAttribute Dene o tamanho mximo permitido para um array ou string. MinLengthAttribute Dene o tamanho mnimo permitido para um array ou string.1 2 3 4 5 6 7 8 9 10 public class Pessoa { public int Id { get; set; } [MinLength(10,ErrorMessage="Tamanho minimo: 10")] [MaxLength(255,ErrorMessage="Tamanho mximo: 255")] public string Nome { get; set; } public ICollection LivrosPublicados { get; set; } public ICollection LivrosRevisados { get; set; } }

StringLengthAttribute Dene o tamanho mnimo e mximo permitido para o campo string.1 2 3 4 5 6 7 8 9 public class Editora { public int EditoraId { get; set; } [StringLength(255,MinimumLength=10)] public string Nome { get; set; } public string Email { get; set; } public string ExtraInfo { get; set; } public ICollection Livros { get; set; } }

NotMappedAttribute Pode ser aplicado em classes ou propriedades. Quando aplicado em classes ou propriedades indica que este no ser includo no momento de denio do banco de dados.1 2 3 4 5 6 7 8 9 10

public class Editora { public int EditoraId { get; set; } public string Nome { get; set; } public string Email { get; set; } [NotMapped] public string ExtraInfo { get; set; } public ICollection Livros { get; set; } }

45

K19 Treinamentos

Entity Framework 4.1 RequiredAttribute Dene que este campo obrigatrio. Este atributo ignorado em propriedades do tipo collection. Quando denido numa referncia, indica que cardinalidade 1 e a propriedade da chave estrangeira no-nula.1 2 3 4 5 6 7 8 9 10

public class Editora { public int EditoraId { get; set; } [Required] public string Nome { get; set; } public string Email { get; set; } public string ExtraInfo { get; set; } public ICollection Livros { get; set; } }

TableAttribute Dene a tabela para o qual a classe mapeada.1 2 3 4 5 6 7 8 9 10 11

[Table("Livros")] public class Livro { public int LivroId { get; set; } public string Titulo { get; set; } public decimal Preco { get; set; } public Editora Editora { get; set; } public Pessoa Autor { get; set; } public Pessoa Revisor { get; set; } }

3.6

Gerando o banco

Uma das vantagens de utilizar o EF4 Code First, que ele capaz de gerar as tabelas do banco para a nossa aplicao. Ele faz isso de acordo com as anotaes colocadas nas classes e as informaes presentes no D B C ONTEXT. As tabelas so geradas quando criamos uma instncia de DbContext() e o contexto necessita fazer alguma requisio ao banco de dados. Por exemplo, quando adicionamos uma entidade ao contexto.1 2 3 4

EditoraContext context = new EditoraContext(); // Neste momento ser criado o banco de dados, caso no exista 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 instncias do tipo System.Data.Entity.IDatabaseInitializer. No EF 4.1 temos 3 classes que denem estratgias para criao do banco de dados: DropCreateDatabaseAlways criar o banco de dados a cada instncia criada do contexto, ideal para ambiente de testes. CreateDatabaseIfNotExists somente criar o banco de dados, caso ele no exista, este a estratgia padro. www.k19.com.br 46

Entity Framework 4.1 DropCreateDatabaseIfModelChanges somente criar o banco de dados caso ele no exista ou caso haja alguma alterao nas suas entidades.1 2 3 4 5 6 //Alterando a estratgia padro Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); EditoraContext context = new EditoraContext(); // Neste momento ser criado o banco de dados, caso no exista context.Editoras.Add(new Editora{ Nome = "Abril" });

3.7

Exerccios

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

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

47

K19 Treinamentos

Entity Framework 4.1

www.k19.com.br

48

Entity Framework 4.1

3. Dena uma classe Editora conforme cdigo abaixo:

1 2 3 4 5 6 7 8 9 10 11

namespace EF4_Code_First { public class Editora { public int Id { get; set; } public string Nome { get; set; } public string Email { get; set; } } }

4. Dena uma classe EditoraContext que derivada de DbContext. Nesta classe dena uma propriedade Editoras do tipo genrico DbSet. 49 K19 Treinamentos

Entity Framework 4.11 2 3 4 5 6 7 8 9 10

using System.Data.Entity; namespace EF4_Code_First { public class EditoraContext : DbContext { public DbSet Editoras { get; set; } } }

5. Dena uma classe GeraTabelas conforme cdigo abaixo:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

namespace EF4_Code_First { class GeraTabelas { static void Main(string[] args) { using (var context = new EditoraContext()) { // Neste momento as tabelas so geradas context.Editoras.Add(new Editora { Nome = "Abril", Email = "abril@email .com" }); } } } }

Atravs do SQL Server Management Express verique se a tabela E DITORAS foi criada corretamente.

3.8

Sobrescrevendo o nome do Banco de Dados

Quando executamos a aplicao, o EF4_Code_First.EditoraContext foi criado. Uma maneira de sobrescrever a conveno do Code First para nome de banco de dados adicionar um arquivo App.cong ou Web.cong que contenha a string de conexo juntamente com a classe do contexto. O arquivo .cong pode ser acrescentado no projeto que contm o assembly tambm. Para adicionar o App.cong ao projeto pelo Microsoft Visual C# Express basta clicar com o boto direito do mouse no projeto e clicar em Add, posteriormente escolher Application Conguration File. Acrescente o connectionStrings ao seu arquivo:1 2 3 4 5 6 7

Quando a aplicao for executada, o banco de dados livraria ser criado. Devemos habilitar a opo MultipleActiveResultSets=True para permitir a leitura de objetos relacionados em www.k19.com.br 50

Entity Framework 4.1 blocos foreach do C#, pois o EF tenta criar um novo leitor de dados e ocorrer uma falha de execuo a menos que a opo MultipleActiveResultSets seja true. Uma outra maneira de fazer a 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 acrescente ao projeto EF4-Code-First o arquivo App.cong com a denio da string de conexo.

3.10

Manipulando entidades

Para manipular as entidades da nossa aplicao, devemos utilizar uma classe derivada de D B C ONTEXT.1 2 var context = new EditoraContext();

3.10.1

Persistindo

Para armazenar as informaes de um objeto no banco de dados basta utilizar o mtodo S A do D B C ONTEXT. As entidades com o estado Added so inseridas no banco de dados quando o mtodo S AVE C HANGES () chamado. Utilize o mtodo System.Data.Entity.DbSet.Add. O mtodo Add adiciona a entidade ao contexto com o estado Added.VE C HANGES ()1 2 3 4 5 6 7 8 using (var context = new EditoraContext()) { Editora editora = new Editora { Nome = "Abril", Email = "[email protected]" }; //Adiciona o estado Added context.Editoras.Add(editora); context.SaveChanges(); }//fecha o contexto ao final

3.10.2

Buscando

Para obter um objeto que contenha informaes do banco de dados basta utilizar o mtodo Find do D B S ET.1 Editora editora = context.Editoras.Find(1);

51

K19 Treinamentos

Entity Framework 4.1

3.10.3

Removendo

As entidades com o estado Deleted so removidas do banco de dados quando o mtodo S AVE C HANGES () chamado. Utilize o mtodo System.Data.Entity.DbSet.Remove. O mtodo Remove remove a entidade do contexto e adiciona a entidade o estado Deleted.1 2 3 Editora editora = context.Editoras.Find(1); context.Editoras.Remove(editora); context.SaveChanges();

3.10.4

Atualizando

Para alterar os dados de um registro correspondente a um objeto basta utilizar as propriedades. Quando as propriedades de uma entidade do contexto alterada, o estado Modied adicionado a esta entidade. Entidades com o estado Modied so atualizados no banco de dados quando o mtodo SaveChanes chamado.1 2 3 Editora editora = context.Editoras.Find(1); editora.Nome = "Abril S/A"; context.SaveChanges();

3.10.5

Listando

Para obter uma listagem com todos os objetos referentes aos registros de uma tabela, podemos utilizar o Language Integrated Query LIN Q, que permite os desenvolvedores escreverem a consulta em C#.1 2 3 4 5 6 7 8 var consulta = from e in context.Editoras where e.Nome.Contains("A") select e; // Equivalente a: SELECT * FROM Editoras e where e.Nome Like A% foreach (var item in consulta) { System.Console.WriteLine("Editora: " + item.Nome); }

3.11

Exerccios

8. Crie um teste para inserir editoras no banco de dados. www.k19.com.br 52

Entity Framework 4.11 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 using System; namespace EF4_Code_First { class InsereEditoraComEF { static void Main(string[] args) { using (var context = new EditoraContext()) { Editora editora = new Editora(); Console.WriteLine("Digite o nome da Editora:"); editora.Nome = Console.ReadLine(); Console.WriteLine("Digite o email da Editora:"); editora.Email = Console.ReadLine(); //Adiciona editora ao contexto //Status: Added context.Editoras.Add(editora); //Persisto editora context.SaveChanges(); } } } }

9. Crie um teste para listar as editoras inseridas no banco de dados.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 using System; using System.Linq; namespace EF4_Code_First { class ListaEditoraComEF { static void Main(string[] args) { using (EditoraContext context = new EditoraContext()) { var consulta = from e in context.Editoras select e; foreach (var item in consulta) { Console.WriteLine("{0}: {1} - {2}", item.Id,item.Nome,item.Email); } } } } }

3.12

Repository

A classe D B C ONTEXT e D B S ET do EF oferece recursos sucientes para que os objetos do domnio sejam recuperados ou persistidos no banco de dados. Porm, em aplicaes com alta complexidade e grande quantidade de cdigo, espalhar as chamadas aos mtodos do D B C ONTEXT e D B S ET pode gerar diculdades na manuteno e no entendimento do sistema. Para melhorar a organizao das nossas aplicaes, diminuindo o custo de manuteno e aumentando a legibilidade do cdigo, podemos aplicar o padro Repository do DDD(Domain 53 K19 Treinamentos

Entity Framework 4.1 Driven Design). Conceitualmente, um repositrio representa o conjunto de todos os objetos de um determinado tipo. Ele deve oferecer mtodos para recuperar e para adicionar elementos. Os repositrios podem trabalhar com objetos prontos na memria ou reconstru-los com dados obtidos de um banco de dados. O acesso ao banco de dados pode ser realizado atravs de ferramenta ORM como o Entity Framework.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 using using using using System; System.Collections.Generic; System.Linq; System.Data.Entity;

namespace EF4_Code_First { public class EditoraRepository { DbContext context; public EditoraRepository(DbContext context) { this.context = context; } public void Adiciona(Editora e) { context.Set().Add(e); context.SaveChanges(); } public Editora Busca(int id) { return context.Set().Find(id); } public List BuscaTodas() { var consulta = from e in context.Set() select e; return consulta.ToList(); } } }

1 2 3 4 5 6 7

Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); var context = new EditoraContext(); EditoraRepository repository = new EditoraRepository(context); List editoras = repository.BuscaTodas();

3.13

Exerccios

10. Implemente um repositrio de editoras criando uma nova classe no projeto EF4-CodeFirst. www.k19.com.br 54

Entity Framework 4.11 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class EditoraRepository { DbContext context; public EditoraRepository(DbContext context) { this.context = context; } public void Adiciona(Editora e) { context.Set().Add(e); context.SaveChanges(); } public Editora Busca(int id) { return context.Set().Find(id); } public List BuscaTodas() { var consulta = from e in context.Set() select e; return consulta.ToList(); } }

11. Altere a classe InsereEditoraComEF para que ela utilize o repositrio de editoras.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 using System; namespace EF4_Code_First { class InsereEditoraComEF { static void Main(string[] args) { var context = new EditoraContext(); EditoraRepository repository = new EditoraRepository(context); Editora editora = new Editora(); Console.WriteLine("Digite o nome da Editora:"); editora.Nome = Console.ReadLine(); Console.WriteLine("Digite o email da Editora:"); editora.Email = Console.ReadLine(); repository.Adiciona(editora); } } }

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

55

K19 Treinamentos

Entity Framework 4.1

www.k19.com.br

56

Captulo 4 Viso Geral do ASP .NET MVC4.1 Necessidades de uma aplicao web

As aplicaes web so acessadas pelos navegadores (browsers). A comunicao entre os navegadores e as aplicaes web realizada atravs de requisies e respostas denidas pelo protocolo HTTP. Portando, ao desenvolver uma aplicao web, devemos estar preparados para receber requisies HTTP e enviar respostas HTTP. Alm disso, na grande maioria dos casos, as aplicaes web devem ser acessadas por diversos usurios simultaneamente. Dessa forma, o desenvolvedor web precisa saber como permitir o acesso simultneo. Outra necessidade das aplicaes web gerar contedo dinmico. Por exemplo, quando um usurio de uma aplicao de email acessa a sua caixa de entrada, ele deseja ver a listagem atualizada dos seus emails. Portanto, fundamental que a listagem dos emails seja gerada no momento da requisio do usurio. O desenvolvedor web precisa utilizar algum mecanismo eciente que permita que o contedo que os usurios requisitam seja gerado dinamicamente. Trabalhar diretamente com as requisies e repostas HTTP e criar um mecanismo eciente para permitir o acesso simultneo e para gerar contedo dinmico no so tarefas simples. Na verdade, 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 sucientemente grandes e podem ser abordados em separado. Porm, no primeiro contato com ASP .NET MVC, interessante ter uma viso geral dos recursos principais e do relacionamento entre eles sem se aprofundar em muito nos detalhes individuais de cada recurso. Portanto, neste captulo, mostraremos de forma sucinta e direta o funcionamento e os conceitos principais do ASP .NET MVC. Nos prximos captulos, discutiremos de maneira mais detalhada as diversas partes do ASP .NET MVC. 57

Viso Geral do ASP .NET MVC

4.3

Aplicao de exemplo

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

Devemos escolher Empty Project conforme gura 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

Viso Geral do ASP .NET MVC

4.3.1

Testando a aplicao

Para vericar o funcionamento do projeto, basta execut-lo atravs do menu: Debug -> Start Debugging. Automaticamente um servidor de desenvolvimento inicializado na mquina e a aplicao implantada nesse servidor. Alm disso, uma janela do navegador padro do sistema aberta na url principal da aplicao. O servidor pode ser nalizado atravs do cone ASP.NET Development Server que ca na barra 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 no projeto 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 as requisies vindas do navegador do usurio e devolver um hipertexto XHTML gerado dinamicamente. A base de todos os controladores System.Web.Mvc.ControllerBase. A implementao padro desta classe abstrata System.Web.Mvc.Controller. Para criar nosso controlador, devemos criar uma classe que seja lha de System.Web.Mvc.Controller e o nome obrigatoriamente deve conter o suxo Controller.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // LivrariaVirtual/Controllers/SaudacaoController.cs using System; using System.Web.Mvc; using System.Web.Routing; namespace LivrariaVirtual.Controllers { public class SaudacaoController : Controller { public string Index() { return "Welcome to ASP.NET MVC!"; } } }

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 colocado na pasta Controllers. 59 K19 Treinamentos

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 Controllers chamada SaudacaoController.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

using System.Web.Mvc; namespace LivrariaVirtual.Controllers { public class SaudacaoController : Controller { // // GET: /Saudacao/ public string Index() { return "Welcome to ASP.NET MVC!"; } } }

4.6

Alterando a pgina inicial

Por padro, as requisies direcionadas a url principal da aplicao so enviadas ao controlador Home. Podemos alterar esse comportamento, modicando o arquivo de rotas da aplicao, 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 exerccio anterior.

4.8

Integrando o Banco de Dados

A nossa aplicao web vai interagir com o banco de dados para recuperar ou armazenar informao. Vimos que a comunicao com uma base de dados pode ser encapsulada atravs www.k19.com.br 60

Viso Geral do ASP .NET MVC do padro Repository. Os Repositorys e as classes que representam as entidades do sistema da livraria 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.NET para a pasta Models da nossa aplicao web. Coloque cada classe separada em um arquivo com o mesmo nome da classe.

1 2 3 4 5 6 7 8 9 10 11 12 13

using System.Collections.Generic; namespace LivrariaVirtual.Models { public class Editora { public int Id { get; set; } public string Nome { get; set; } public string Email { get; set; } public virtual ICollection Livros { get; set; } } }

1 2 3 4 5 6 7 8 9 10 11 12

namespace LivrariaVirtual.Models { public class Livro { public int Id { get; set; } public string Titulo { get; set; public decimal Preco { get; set; public int EditoraId { get; set; public virtual Editora Editora { } }

} } } get; set; }

1 2 3 4 5 6 7 8 9 10 11

using System.Data.Entity; namespace LivrariaVirtual.Models { public class LivrariaVirtualContext : DbContext { public DbSet Editoras { get; set; } public DbSet Livros { get; set; } } }

61

K19 Treinamentos

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

using System.Collections.Generic; using System.Linq; namespace LivrariaVirtual.Models { public class LivroRepository { private LivrariaVirtualContext context = new LivrariaVirtualContext(); public void Adiciona(Livro e) { context.Livros.Add(e); context.SaveChanges(); } public Livro Busca(int id) { return context.Livros.Find(id); } public List BuscaTodas() { var consulta = from e in context.Livros select e; return consulta.ToList(); } } }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

using System.Collections.Generic; using System.Linq; namespace LivrariaVirtual.Models { public class EditoraRepository { private LivrariaVirtualContext context public void Adiciona(Editora e) { context.Editoras.Add(e); context.SaveChanges(); } public Editora Busca(int id) { return context.Editoras.Find(id); } public List BuscaTodas() { var consulta = from e in context.Editoras select e; return consulta.ToList(); } } }

= new LivrariaVirtualContext();

www.k19.com.br

62

Viso Geral do ASP .NET MVC

4.10

Listando entidades

Uma funcionalidade bsica que a nossa aplicao web deve oferecer para os usurios a listagem das entidades do sistema (livro e editora). Para cada entidade, ser criado um controlador que car encarregado de montar a lista da entidade correspondente. Vamos construir um exemplo que lista as editoras a partir da URL /Editoras.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 using using using using using using System; System.Collections.Generic; System.Linq; System.Web; System.Web.Mvc; LivrariaVirtual.Models;

namespace LivrariaVirtual.Controllers { public class EditorasController : Controller { // // GET: /Editoras/ public ActionResult Index() { var editoraRepository = new EditoraRepository(); return View(editoraRepository.BuscaTodas()); } } }

Repare que o controlador responsvel pela lista de editoras interage com o repository de Editora. 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 devemos criar uma pgina com o mesmo nome da action Index. Alm disso, esta pgina deve ser criada, por conveno, dentro de uma pasta Editoras, pasta com o mesmo nome do nosso controller sem o suxo Controller, dentro da pasta Views.

63

K19 Treinamentos

Viso Geral do ASP .NET MVC

www.k19.com.br

64

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

@model IList @{ ViewBag.Title = "Editoras"; } Editoras Nome Email @foreach (var item in Model) { @Html.DisplayFor(modelItem => item.Nome) @Html.DisplayFor(modelItem => item.Email) @Html.ActionLink("Edit", "Edit", new { id=item.Id }) }

Para gerar o contedo dinmico de nossa pgina, estamos utilizando Razor que permite acrescentar 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 pgina e renderizao de elementos HTML. Na nossa pgina Index estamos utilizando a propriedade Html que uma instncia da classe System.Web.Mvc.HtmlHelper que prov mtodos para renderizar elementos como input, select, anchor, form. Veremos com mais detalhes os Helpers e Razor nos captulos posteriores.

4.11

Exerccios

5. Implemente um controlador chamado EditorasController para que liste todas as editoras existentes na base de dados quando a url /Editoras for requisitada. 6. Implemente um controlador chamado LivrosController para que liste todas as editoras existentes 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 cadastro de editoras e livros. O primeiro passo, para implementar essa funcionalidade, criar um 65 K19 Treinamentos

Viso Geral do ASP .NET MVC formulrio de cadastro de editora e outro de livro. Por exemplo, suponha que para criar uma editora devemos acessar a url /Editoras/Create. Primeiro devemos criar uma mtodo para action Create 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

using using using using using using

System; System.Collections.Generic; System.Linq; System.Web; System.Web.Mvc; LivrariaVirtual.Models;

namespace LivrariaVirtual.Controllers { public class EditorasController : Controller { // // GET: /Editoras/ public ActionResult Index() { var editoraRepository = new EditoraRepository(); return View(editoraRepository.BuscaTodas()); } // // GET: /Editoras/Create public ActionResult Create() { return View(); } } }

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, portanto deveremos ter um arquivo com o nome Create.cshtml. www.k19.com.br 66

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 @model LivrariaVirtual.Models.Editora @{ ViewBag.Title = "Create"; } Create @using (@Html.BeginForm()) { Editora @Html.LabelFor(model => model.Nome) @Html.EditorFor(model => model.Nome) @Html.LabelFor(model => model.Email) @Html.EditorFor(model => model.Email) }

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

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 using using using using using using System; System.Collections.Generic; System.Linq; System.Web; System.Web.Mvc; LivrariaVirtual.Models;

namespace LivrariaVirtual.Controllers { public class EditorasController : Controller { private EditoraRepository editoraRepository = new EditoraRepository(); // // GET: /Editoras/ public ActionResult Index() { return View(this.editoraRepository.BuscaTodas()); } // // GET: /Editoras/Create public ActionResult Create() { return View(); } // // POST: /Editoras/Create [HttpPost] public ActionResult Create(Editora editora) { editoraRepository.Adiciona(editora); return RedirectToAction("Index"); } } }

4.13

Exerccios

7. Crie um mtodo para action Create no nosso controlador EditorasController responsvel por apresentar um formulrio de cadastramento de editoras. Este formulrio dever ser acessado atravs de uma URL /Editoras/Create. Ao enviar os dados do formulrio para o servidor atravs de uma requisio POST, dena um mtodo para esta action que receba estes dados enviados pelo usurio e salve na base de dados utilizando a nossa classe EditoraRepository. 8. Crie um mtodo para action Create no nosso controlador LivrosController responsvel por apresentar um formulrio de cadastramento de livros. Este formulrio dever ser acessado atravs de uma URL /Livros/Create. Ao enviar os dados do formulrio para o servidor atravs de uma requisio POST, dena um mtodo para esta action que receba estes dados enviados pelo usurio e salve na base de dados utilizando a nossa classe LivroRepository. www.k19.com.br 68

Viso Geral do ASP .NET MVC Devemos permitir que o usurio possa denir a editora a qual o livro pertence. Para isto, 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.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

using using using using using using using using

System; System.Collections.Generic; System.Data; System.Data.Entity; System.Linq; System.Web; System.Web.Mvc; LivrariaVirtual.Models;

namespace LivrariaVirtual.Controllers { public class LivrosController : Controller { private LivroRepository livroRepository = new LivroRepository(); private EditoraRepository editoraRepository = new EditoraRepository(); // // GET: /Livros/ public ViewResult Index() { return View(livroRepository.BuscaTodas()); } // // GET: /Livros/Create public ActionResult Create() { var consulta = editoraRepository.BuscaTodas().Select(e => new { e.Id, e. Nome}); ViewBag.Editoras = consulta.ToList(); return View(); } // // POST: /Livros/Create [HttpPost] public ActionResult Create(Livro livro) { livroRepository.Adiciona(livro); return RedirectToAction("Index"); }

} }

Para construir a nossa caixa de seleo, podemos utilizar o mtodo DropDownListFor da propriedade Html. 69 K19 Treinamentos

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

@model LivrariaVirtual.Models.Livro @{ ViewBag.Title = "Insere Livro"; } Insere Livro @using (Html.BeginForm()) { Livro @Html.LabelFor(model => model.Titulo) @Html.EditorFor(model => model.Titulo) @Html.LabelFor(model => model.Preco) @Html.EditorFor(model => model.Preco) @Html.LabelFor(model => model.EditoraId) @Html.DropDownListFor(model => model.EditoraId,new SelectList(@ViewBag. Editoras, "Id", "Nome")) }

4.14

Alterando entidades

Normalmente surge a necessidade de atualizar os dados de uma editora ou livro. Por exemplo, uma atualizao dos preos. Portanto, a nossa aplicao deve permitir que o usurio faa alteraes nos livros e nas editoras. Suponha que para alterar as informaes da editora, o usurio precise acessar a URL /Editoras/Edit/1, onde o 1 (um) dene o ID da editora que o usurio deseje alterar as informaes e ser passado como parmetro na nossa action. O primeiro passo denir um mtodo para a action Edit no controlador EditorasController que receber o Id da editora fornecido pelo usurio e encaminhar para o formulrio de edio. www.k19.com.br 70

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

using using using using using using

System; System.Collections.Generic; System.Linq; System.Web; System.Web.Mvc; LivrariaVirtual.Models;

namespace LivrariaVirtual.Controllers { public class EditorasController : Controller { private EditoraRepository editoraRepository = new EditoraRepository(); // // GET: /Editoras/ public ActionResult Index() { return View(this.editoraRepository.BuscaTodas()); } // // GET: /Editoras/Create public ActionResult Create() { return View(); } // // POST: /Editoras/Create [HttpPost] public ActionResult Create(Editora editora) { editoraRepository.Adiciona(editora); return RedirectToAction("Index"); } // // GET: /Editoras/Edit/5 public ActionResult Edit(int id) { Editora editora = editoraRepository.Busca(id); return View(editora); }

} }

O formulrio de edio dever vir preenchido com as informaes da editora que o usurio deniu. Para isto, passamos como parmetro editora no mtodo View e acessamos atravs da propriedade Model. 71 K19 Treinamentos

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

@model LivrariaVirtual.Models.Editora @{ ViewBag.Title = "Edit"; } Edit @using (Html.BeginForm()) { Editora @Html.HiddenFor(model => model.Id) @Html.LabelFor(model => model.Nome) @Html.EditorFor(model => model.Nome) @Html.LabelFor(model => model.Email) @Html.EditorFor(model => model.Email) }

Ao submeter o formulrio, requisio POST por padro, devemos ter um mtodo para esta action que receber os dados enviados e far a alterao em nossa base de dados. www.k19.com.br 72

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

using using using using using using

System; System.Collections.Generic; System.Linq; System.Web; System.Web.Mvc; LivrariaVirtual.Models;

namespace LivrariaVirtual.Controllers { public class EditorasController : Controller { private EditoraRepository editoraRepository = new EditoraRepository(); // // GET: /Editoras/ public ActionResult Index() { return View(this.editoraRepository.BuscaTodas()); } // // GET: /Editoras/Create public ActionResult Create() { return View(); } // // POST: /Editoras/Create [HttpPost] public ActionResult Create(Editora editora) { editoraRepository.Adiciona(editora); return RedirectToAction("Index"); } // // GET: /Editoras/Edit/5 public ActionResult Edit(int id) { Editora editora = editoraRepository.Busca(id); return View(editora); } // // POST: /Editoras/Edit/5 [HttpPost] public ActionResult Edit(Editora e) { editoraRepository.Atualiza(e); return RedirectToAction("Index"); } } }

Devemos acrescentar na nossa classe EditoraRepository o mtodo Atualiza. 73 K19 Treinamentos

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

using System.Collections.Generic; using System.Linq; using System.Data; namespace LivrariaVirtual.Models { public class EditoraRepository { private LivrariaContext context public void Adiciona(Editora e) { context.Editoras.Add(e); context.SaveChanges(); } public void Atualiza(Editora e) { context.Entry(e).State = EntityState.Modified; context.SaveChanges(); } public Editora Busca(int id) { return context.Editoras.Find(id); } public List BuscaTodas() { var consulta = from e in context.Editoras select e; return consulta.ToList(); } } }

= new LivrariaContext();

4.14.1

Link de alterao

Nas listagens de editoras e livros, podemos acrescentar um link alterao para cada item. Para isso, devemos alterar as pginas de listagem. www.k19.com.br 74

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

@model IList @{ ViewBag.Title = "Editoras"; } Editoras Nome Email @foreach (var item in Model) { @Html.DisplayFor(modelItem => item.Nome) @Html.DisplayFor(modelItem => item.Email) @Html.ActionLink("Edit", "Edit", new { id=item.Id }) }

4.15

Exerccios

9. Implemente um mtodo para a action Edit no controlador EditorasController que ser responsvel por apresentar um formulrio para a atualizao de uma editora. Ao submeter o formulrio devemos ter um mtodo para esta action que receber os dados enviados e far a alterao em nossa base de dados. No esquea da modicar a pgina que lista as editoras para chamar o formulrio de edio atravs de um link.

10. Implemente um mtodo para a action Edit no controlador LivrosController que ser responsvel por apresentar um formulrio para a atualizao de um livro. Ao submeter o formulrio devemos ter um mtodo para esta action que receber os dados enviados e far a alterao em nossa base de dados. No esquea da modicar a pgina que lista os livros para chamar o formulrio de edio atravs de um link. No LivrosController devemos ter: 75 K19 Treinamentos

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

// // GET: /Livros/Edit/5 public ActionResult Edit(int id) { Livro livro = livroRepository.Busca(id); var consulta = editoraRepository.BuscaTodas().Select(e => new { e.Id, e.Nome }); ViewBag.Editoras = consulta.ToList(); ViewBag.editora = new Editora { Nome = "iuiuiu" }; return View(livro); } // // POST: /Editoras/Edit/5 [HttpPost] public ActionResult Edit(Livro l) { livroRepository.Atualiza(l); return RedirectToAction("Index"); }

Classe LivroRepository:

1 2 3 4 5 6

public void Atualiza(Livro l) { context.Entry(l).State = EntityState.Modified; context.SaveChanges(); }

A pgina Edit.cshtml: www.k19.com.br 76

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

@model LivrariaVirtual.Models.Livro @{ ViewBag.Title = "Edit"; } Alterar Livro @using (Html.BeginForm()) { Livro @Html.HiddenFor(model => model.Id) @Html.LabelFor(model => model.Titulo) @Html.EditorFor(model => model.Titulo) @Html.LabelFor(model => model.Preco) @Html.EditorFor(model => model.Preco) @Html.LabelFor(model => model.EditoraId) @Html.DropDownListFor(model => model.EditoraId, new SelectList(ViewBag. Editoras,"Id","Nome")) }

4.16

Removendo entidades

Para nalizar nosso conjunto de funcionalidades bsicas, implementaremos a remoo de entidades. Para isso podemos adicionar um link de remover para cada item das listagens de editoras e livros. Assim como zemos com os links de alterao. Segue a listagem de Editoras acrescentando o link de remoo: 77 K19 Treinamentos

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 @model IList @{ ViewBag.Title = "Editoras"; } Editoras Nome Email @foreach (var item in Model) { @Html.DisplayFor(modelItem => item.Nome) @Html.DisplayFor(modelItem => item.Email) @Html.ActionLink("Edit", "Edit", new { id=item.Id }) @Html.ActionLink("Delete", "Delete", new { id=item.Id }) }

Depois de acrescentado o link de remoo nas listas, o prximo passo implementar os mtodos para estas actions nos controladores que faro a remoo atravs das classes Repository. www.k19.com.br 78

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 using using using using using using System; System.Collections.Generic; System.Linq; System.Web; System.Web.Mvc; LivrariaVirtual.Models;

namespace LivrariaVirtual.Controllers { public class EditorasController : Controller { private EditoraRepository editoraRepository = new EditoraRepository(); // // GET: /Editoras/Delete/5 public ActionResult Delete(int id) { Editora editora = editoraRepository.Busca(id); return View(editora); } // // POST: /Editoras/Delete/5 [HttpPost, ActionName("Delete")] public ActionResult DeleteConfirmed(int id) { Editora editora = editoraRepository.Busca(id); editoraRepository.Remove(editora); return RedirectToAction("Index"); } } }

Ao enviar uma requisio POST atravs da URL /Editoras/Delete/5, o mtodo que tratar esta action ser o DeleteConrmed. Para isto, renomeamos a action com a anotao ActionName, pois por padro a action contm o mesmo nome do mtodo do controlador. Precisamos tambm denir uma pgina de conrmao da remoo da entidade: 79 K19 Treinamentos

Viso Geral do ASP .NET MVC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 @model LivrariaVirtual.Models.Editora @{ ViewBag.Title = "Apagar Editora"; } Apagar Editora Voc tem certeza que deseja apagar esta editora? Editora Nome @Html.DisplayFor(model => model.Nome) Email @Html.DisplayFor(model => model.Email) @using (Html.BeginForm()) { | @Html.ActionLink("Voltar para listagem de Editoras", "Index") }

4.17

Exerccios

11. Implemente os mtodos para as actions de remoo no EditorasController que sero responsveis por remover uma editora. No se esquea de modicar a pgina de listagem de editoras para incluir o link de remoo. 12. Impl