· Sobre a K19 1 Seguro Treinamento 2 Termo de Uso 3 Cursos 4 1 Banco de Dados 1 ... K51 - Design...

230
TREINAMENTOS Desenvolvimento Web com ASP.NET MVC 4

Transcript of  · Sobre a K19 1 Seguro Treinamento 2 Termo de Uso 3 Cursos 4 1 Banco de Dados 1 ... K51 - Design...

  • TREINAMENTOS

    Desenvolvimento Webcom ASP.NET MVC 4

  • Desenvolvimento Web com ASP.NET MVC 4

    22 de junho de 2013

    Sumrio i

    Sobre a K19 1

    Seguro Treinamento 2

    Termo de Uso 3

    Cursos 4

    1 Banco de Dados 11.1 Sistemas Gerenciadores de Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3 Bases de Dados (Databases) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.4 Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.5 CRUD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.6 Chaves Primria e Estrangeira . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.7 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    2 ADO.NET 232.1 Driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.2 ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.3 ODBC Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.4 Criando uma conexo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.5 Inserindo registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.7 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.8 SQL Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.10 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.11 Listando registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.12 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.13 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322.14 Connection Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    www.facebook.com/k19treinamentos i

  • SUMRIO ii

    2.15 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332.16 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352.17 Desafios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    3 Entity Framework 373.1 Mltiplas sintaxes da linguagem SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.2 Orientao a Objetos VS Modelo Relacional . . . . . . . . . . . . . . . . . . . . . . . . . . 373.3 Ferramentas ORM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383.4 Instalando o Entity Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393.5 Configurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.6 Convenes de Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413.7 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473.8 Data Annotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553.10 Gerenciamento de entidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553.11 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573.12 Repositrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    4 Code First Migrations 614.1 Code First Migrations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674.3 Acrescentando uma nova entidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

    5 Viso Geral do ASP.NET MVC 755.1 Necessidades de uma aplicao web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755.2 ASP.NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765.3 MVC e Front Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765.4 Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775.5 Exemplo de uma Aplicao Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795.7 Integrao com Entity Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845.8 Scaffold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

    6 Camada de Apresentao 896.1 Razor e ASPX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 896.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916.3 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926.4 ViewBag e Strogly Typed Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 936.5 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 956.6 HTML Helpers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 986.7 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1076.8 Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1116.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1146.10 Partial views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1206.11 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

    7 Camada de Controle 1257.1 Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

    ii www.k19.com.br

  • iii SUMRIO

    7.2 ActionResult . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1267.3 Parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1277.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1287.5 TempData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1317.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1327.7 Rotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1337.8 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

    8 Validao 1398.1 Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1398.2 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408.3 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1418.4 Anotaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1448.5 Validao no lado do Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1458.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

    9 Sesso 1499.1 Identificando os navegadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1499.2 Sesses no ASP.NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1499.3 Session Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1509.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

    10 Autenticao 15710.1 Filtro de Autenticao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15710.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

    11 Tratamento de Erros 16711.1 Try-Catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16811.2 Custom Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16911.3 Http Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16911.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

    A ASP.NET Web API 175A.1 REST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175A.2 Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176A.3 URIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176A.4 Operaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176A.5 Media Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178A.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

    B Projeto 183B.1 Modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183B.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183B.3 Persistncia - Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184B.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184B.5 Persistncia - Configurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185B.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185B.7 Persistncia - Repositrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185B.8 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185B.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

    www.facebook.com/k19treinamentos iii

  • SUMRIO iv

    B.10 Apresentao - Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188B.11 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188B.12 Cadastrando e Listando Selees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191B.13 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191B.14 Removendo Selees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194B.15 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194B.16 Cadastrando, Listando e Removendo Jogadores . . . . . . . . . . . . . . . . . . . . . . . 196B.17 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196B.18 Removendo Jogadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199B.19 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200B.20 Membership e Autorizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202B.21 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202B.22 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210B.23 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211B.24 Controle de Erro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211B.25 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212B.26 Enviando email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213B.27 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

    C Respostas 217

    iv www.k19.com.br

  • 1 SUMRIO

    Sobre a K19

    A K19 uma empresa especializada na capacitao de desenvolvedores de software. Sua equipe composta por profissionais formados em Cincia da Computao pela Universidade de So Paulo(USP) e que possuem vasta experincia em treinamento de profissionais para rea de TI.

    O principal objetivo da K19 oferecer treinamentos de mxima qualidade e relacionados s prin-cipais tecnologias utilizadas pelas empresas. Atravs desses treinamentos, seus alunos se tornamcapacitados para atuar no mercado de trabalho.

    Visando a mxima qualidade, a K19 mantm as suas apostilas em constante renovao e melho-ria, oferece instalaes fsicas apropriadas para o ensino e seus instrutores esto sempre atualizadosdidtica e tecnicamente.

    www.facebook.com/k19treinamentos 1

  • SUMRIO 2

    Seguro Treinamento

    Na K19 o aluno faz o curso quantas vezes quiser!

    Comprometida com o aprendizado e com a satisfao dos seus alunos, a K19 a nica que pos-sui o Seguro Treinamento. Ao contratar um curso, o aluno poder refaz-lo quantas vezes desejarmediante a disponibilidade de vagas e pagamento da franquia do Seguro Treinamento.

    As vagas no preenchidas at um dia antes do incio de uma turma da K19 sero destinadas aoalunos que desejam utilizar o Seguro Treinamento. O valor da franquia para utilizar o Seguro Treina-mento 10% do valor total do curso.

    2 www.k19.com.br

  • 3 SUMRIO

    Termo de UsoTermo de Uso

    Todo o contedo desta apostila propriedade da K19 Treinamentos. A apostila pode ser utilizadalivremente para estudo pessoal . Alm disso, este material didtico pode ser utilizado como materialde apoio em cursos de ensino superior desde que a instituio correspondente seja reconhecida peloMEC (Ministrio da Educao) e que a K19 seja citada explicitamente como proprietria do material.

    proibida qualquer utilizao desse material que no se enquadre nas condies acima semo prvio consentimento formal, por escrito, da K19 Treinamentos. O uso indevido est sujeito smedidas legais cabveis.

    www.facebook.com/k19treinamentos 3

  • SUMRIO 4

    K01- Lgica de Programao

    K11 - Orientao a Objetos em Java

    K12 - Desenvolvimento Web com JSF2 e JPA2

    K21 - Persistncia com JPA2 e Hibernate

    K22 - Desenvolvimento Web Avanado com JFS2, EJB3.1 e CDI

    K23 - Integrao de Sistemas com Webservices, JMS e EJB

    K31 - C# e Orientao a Objetos

    K32 - Desenvolvimento Web com ASP.NET MVC

    TREINA

    MENT

    OS

    TREINAMENTOSTREINAMENTOS Conhea os nossos cursos

    www.k19.com.br/cursos

    K02 - Desenvolvimento Web com HTML, CSS e JavaScript

    K03 - SQL e Modelo Relacional

    K41 - Desenvolvimento Mobile com Android

    K51 - Design Patterns em Java

    K52 - Desenvolvimento Web com Struts

    4 www.k19.com.br

  • BANCO DE DADOS

    CA

    P

    TU

    LO

    1Em geral, as aplicaes necessitam armazenar dados de forma persistente para consult-los pos-

    teriormente. Por exemplo, a aplicao de uma livraria precisa armazenar os dados dos livros e dosautores de forma persistente.

    Suponha que esses dados sejam armazenados em arquivos do sistema operacional. Vrios fato-res importantes nos levam a descartar tal opo. A seguir, apresentamos as principais dificuldades aserem consideradas na persistncia de dados.

    Segurana: O acesso s informaes potencialmente confidenciais deve ser controlado de formaque apenas usurios e sistemas autorizados possam manipul-las.

    Integridade: Restries relacionadas aos dados armazenados devem ser respeitadas para que as in-formaes estejam sempre consistentes.

    Consulta: O tempo gasto para realizar as consultas aos dados armazenados deve ser o menor poss-vel.

    Concorrncia: Em geral, diversos sistemas e usurios acessaro concorrentemente as informaesarmazenadas. Apesar disso, a integridade dos dados deve ser preservada.

    Considerando todos esses aspectos, conclumos que um sistema complexo seria necessrio parapersistir as informaes de uma aplicao de maneira adequada. Felizmente, tal tipo de sistema jexiste e conhecido como Sistema Gerenciador de Banco de Dados (SGBD).

    Figura 1.1: Sistema Gerenciador de Banco de Dados

    Sistemas Gerenciadores de Banco de DadosNo mercado, h diversas opes de sistemas gerenciadores de banco de dados. Os mais popularesso:

    Oracle Database

    SQL Server

    www.facebook.com/k19treinamentos 1

  • BANCO DE DADOS 2

    MySQL Server

    PostgreSQL

    SQL ServerNeste treinamento, utilizaremos o SQL Server Express, que mantido pela Microsoft. O SQL ServerExpress 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 grfica chamadode Microsoft SQL Server Management Studio Express.

    Bases de Dados (Databases)Um sistema gerenciador de banco de dados capaz de gerenciar informaes de diversos sistemasao mesmo tempo. Por exemplo, as informaes dos clientes de um banco, alm dos produtos de umaloja virtual ou dos livros de uma livraria.

    Suponha que os dados fossem mantidos sem nenhuma separao lgica. Implementar regrasde segurana especficas seria extremamente complexo. Tais regras criam restries quanto ao con-tedo que pode ser acessado por cada usurio. Por exemplo, determinado usurio poderia ter per-misso de acesso aos dados dos clientes do banco, mas no s informaes dos produtos da lojavirtual, ou dos livros da livraria.

    Para obter uma organizao melhor, os dados so armazenados separadamente em um SGDB.Da surge o conceito de base de dados (database). Uma base de dados um agrupamento lgico dasinformaes de um determinado domnio.

    Criando uma base de dados no SQL Server Express

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

    2 www.k19.com.br

    http://www.microsoft.com/express/Database/
  • 3 BANCO DE DADOS

    Repare que alm da base de dados livraria h outras bases. Essas bases foram criadas automati-camente pelo prprio SQL Server Express para teste ou para guardar algumas configuraes.

    Quando uma base de dados no mais necessria, ela pode ser removida atravs do comandoDROP DATABASE.

    TabelasUm servidor de banco de dados dividido em bases de dados com o intuito de separar as informa-es de domnios diferentes. Nessa mesma linha de raciocnio, podemos dividir os dados de umabase a fim de agrup-los segundo as suas correlaes. Essa separao feita atravs de tabelas. Porexemplo, no sistema de um banco, interessante separar o saldo e o limite de uma conta, do nome eCPF de um cliente. Ento, poderamos criar uma tabela para os dados relacionados s contas e outrapara os dados relacionados aos clientes.

    Uma tabela formada por registros (linhas) e os registros so formados por campos (colunas).

    www.facebook.com/k19treinamentos 3

  • BANCO DE DADOS 4

    Clientenome idade cpfJos 27 31875638735Maria 32 30045667856

    Contanumero saldo limite1 1000 5002 2000 700

    Tabela 1.1: Tabelas para armazenar os dados relacionados aos clientes e s contas

    Por exemplo, considere uma tabela para armazenar as informaes dos clientes de um banco. Cadaregistro dessa tabela armazena em seus campos os dados de um determinado cliente.

    Criando tabelas no SQL Server Express

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

    4 www.k19.com.br

  • 5 BANCO DE DADOS

    www.facebook.com/k19treinamentos 5

  • BANCO DE DADOS 6

    No SQL Server os nomes das tabelas so precedidas pelo ID do usurio que possui a tabela. Nocaso 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 DROP TABLE.

    CRUDAs operaes bsicas para manipular os dados persistidos so: inserir, ler, alterar e remover.

    Essas operaes so realizadas atravs de uma linguagem de consulta denominada SQL (Structu-red Query Language). Essa linguagem oferece quatro comandos bsicos: INSERT, SELECT, UPDATE

    6 www.k19.com.br

  • 7 BANCO DE DADOS

    e DELETE. Esses comandos so utilizados para inserir, ler, alterar e remover registros, respectiva-mente.

    www.facebook.com/k19treinamentos 7

  • BANCO DE DADOS 8

    8 www.k19.com.br

  • 9 BANCO DE DADOS

    Chaves Primria e EstrangeiraSuponha que os livros da nossa livraria sejam classificados por editoras. As editoras possuem nomee telefone. Para armazenar esses dados, uma nova tabela deveria ser criada.

    Nesse momento, teramos duas tabelas (Livro e Editora). Constantemente, a aplicao da livrariadever descobrir qual a editora de um determinado livro ou quais so os livros de uma determinadaeditora. Para isso, os registros da tabela Editora devem estar relacionados aos da tabela Livro.

    Na tabela Livro, poderamos adicionar uma coluna para armazenar o nome da editora dos livros.Dessa forma, se algum quiser recuperar as informaes da editora de um determinado livro, deve

    www.facebook.com/k19treinamentos 9

  • BANCO DE DADOS 10

    consultar a tabela Livro para obter o nome da editora correspondente. Depois, com esse nome, deveconsultar a tabela Editora para obter as informaes da editora.

    Porm, h um problema nessa abordagem. A tabela Editora aceita duas editoras com o mesmonome. Dessa forma, eventualmente, no conseguiramos descobrir os dados corretos da editora deum determinado livro. Para resolver esse problema, deveramos criar uma restrio na tabela Editoraque proba a insero de editoras com o mesmo nome.

    Para resolver esse problema no SQL Server Express, poderamos adicionar a propriedade UNI-QUE no campo nome da tabela Editora. Porm, ainda teramos mais um problema. Na tabela Li-vro, poderamos adicionar registros vinculados a editoras inexistentes, pois no h nenhuma relaoexplcita entre as tabelas. Para solucionar esses problemas, devemos utilizar o conceito de chaveprimria e chave estrangeira.

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

    Ento, poderamos adicionar um campo numrico na tabela Editora e torn-lo chave primria.Vamos chamar esse campo de id. Na tabela Livro, podemos adicionar um campo numrico chamadoeditora_id que deve ser utilizado para guardar o valor da chave primria da editora correspondenteao livro. Alm disso, o campo editora_id deve estar explicitamente vinculado com o campo id databela Editora. Para estabelecer esse vnculo, o campo editora_id da tabela Livro deve ser uma chaveestrangeira associada chave primria da tabela Editora.

    Uma chave estrangeira um conjunto de uma ou mais colunas de uma tabela que possuem va-lores iguais aos da chave primria de outra tabela.

    Com a definio da chave estrangeira, um livro no pode ser inserido com o valor do campoeditora_id invlido. Caso tentssemos fazer isso, obteramos uma mensagem de erro.

    Exerccios de Fixao

    1 Abra o Microsoft SQL Server Management Studio Express utilizando NOME_DA_MAQUINASQLEXPRESS como Server Name, SQL Server Authentication como Authentication, sa como Logine sa como Password.

    10 www.k19.com.br

  • 11 BANCO DE DADOS

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

    www.facebook.com/k19treinamentos 11

  • BANCO DE DADOS 12

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

    12 www.k19.com.br

  • 13 BANCO DE DADOS

    4 Crie uma tabela chamada Editoras conforme as figuras abaixo.

    www.facebook.com/k19treinamentos 13

  • BANCO DE DADOS 14

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

    Alm disso o campo Id deve ser uma chave primria.

    14 www.k19.com.br

  • 15 BANCO DE DADOS

    O campo Id dever ser incrementado automaticamente. Defina ele com a propriedade Identitysegundo a figura abaixo:

    5 Crie uma tabela chamada Livros conforme as figuras abaixo:

    www.facebook.com/k19treinamentos 15

  • BANCO DE DADOS 16

    Lembrando de NO marcar a opo ALLOW NULL. Alm disso o campo Id deve ser uma chaveprimria e automaticamente incrementada.

    Voc precisa tornar o campo EditoraId uma chave estrangeira. Clique com o boto direito sobrea coluna EditoraId e selecione a opo Relantioships..., conforme a figura abaixo:

    16 www.k19.com.br

  • 17 BANCO DE DADOS

    Devemos acrescentar o relacionamento entre livro e editora. Clique em Add e posteriormente noboto direita na linha Tables and Columns Specification.

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

    www.facebook.com/k19treinamentos 17

  • BANCO DE DADOS 18

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

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

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

    18 www.k19.com.br

  • 19 BANCO DE DADOS

    7 Consulte os registros da tabela Editoras, e em seguida consulte a tabela Livros. Veja exemploslogo abaixo:

    www.facebook.com/k19treinamentos 19

  • BANCO DE DADOS 20

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

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

    20 www.k19.com.br

  • 21 BANCO DE DADOS

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

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

    www.facebook.com/k19treinamentos 21

  • BANCO DE DADOS 22

    12 Faa uma consulta para buscar todos os livros de uma determinada editora. Veja um exemplona figura abaixo:

    22 www.k19.com.br

  • ADO.NET

    CA

    P

    TU

    LO

    2No captulo anterior, aprendemos que utilizar bancos de dados uma tima alternativa para

    armazenar os dados de uma aplicao. Entretanto, voc deve ter percebido que as interfaces dispo-nveis para interagir com o SQL Server Express no podem ser utilizadas por qualquer pessoa. Parautiliz-las, necessrio conhecer a linguagem SQL e os conceitos do modelo relacional. Em geral, asinterfaces dos outros SGDBs exigem os mesmos conhecimentos.

    SELECT * FROM tbl_funcionarios WHEREnome LIKE %jonas%;

    INSERT INTO tbl_funcionarios (nome, codigo, salario) VALUES (Rafael, 1234,1000);

    Figura 2.1: Usurios comuns no possuem conhecimento sobre SQL ou sobre o modelo relacional

    Para resolver esse problema, podemos desenvolver aplicaes com interfaces que no exijam co-nhecimentos tcnicos de SQL ou do modelo relacional para serem utilizadas. Dessa forma, usurioscomuns poderiam manipular as informaes do banco de dados atravs dessas aplicaes. Nessaabordagem, os usurios interagem com as aplicaes e as aplicaes interagem com os SGDBs.

    www.k19.com.br

    Cadastro de Funcionrios

    Nome:

    Cdigo:

    Salrio:

    Figura 2.2: Usurios comuns devem utilizar interfaces simples

    www.facebook.com/k19treinamentos 23

  • ADO.NET 24

    DriverAs aplicaes interagem com os SGDBs atravs de troca de mensagens. Os SGDBs definem o formatodas mensagens. Para no sobrecarregar o canal de comunicao entre as aplicaes e os SGDBs, asmensagens trocadas devem ocupar o menor espao possvel. Geralmente, protocolos binrios somais apropriados para reduzir o tamanho das mensagens e consequentemente diminuir a carga docanal de comunicao. Por isso, os SGDBs utilizam protocolos binrios.

    getTransactionbegin

    commit

    rollback

    persistgetReference

    nd

    1011011100010010

    Figura 2.3: Diminuindo o tamanho das mensagens para no sobrecarregar o meio de comunicao

    Mensagens binrias so facilmente interpretadas por computadores. Por outro lado, so com-plexas para um ser humano compreender. Dessa forma, o trabalho dos desenvolvedores seria muitocomplexo, aumentando o custo para o desenvolvimento e manuteno das aplicaes.

    1011010111001011000110101111010111011100010110100111010111010010110011 1011010111

    001011000110101111010111011100010110100111010111010010110011

    1011010111

    0010110001

    1010111101

    0111011100

    0101101001

    1101011101

    0010110011

    Figura 2.4: Mensagens binrias so altamente complexas para os seres humanos

    Para resolver esse problema e facilitar o desenvolvimento das aplicaes, as empresas propriet-

    24 www.k19.com.br

  • 25 ADO.NET

    rias dos SGDBs, normalmente, desenvolvem e distribuem drivers de conexo. Um driver de conexoatua como um intermedirio entre as aplicaes e os SGDBs.

    Os drivers de conexo so tradutores de comandos escritos em uma determinada linguagemde programao para comandos definidos de acordo com o protocolo de um SGDB. Utilizando umdriver de conexo, os desenvolvedores das aplicaes no manipulam diretamente as mensagensbinrias trocadas entre as aplicaes e os SGDBs.

    Mais SobreEm alguns casos, o protocolo binrio de um determinado SGDB fechado. Consequen-temente, a nica maneira de se comunicar com ele atravs de um driver de conexo

    oferecido pelo fabricante desse SGDB.

    ODBCSuponha que os proprietrios dos bancos de dados desenvolvessem os drivers de maneira total-mente independente. Consequentemente, cada driver teria sua prpria interface, ou seja, seu pr-prio conjunto de instrues. Dessa maneira, o desenvolvedor da aplicao precisa conhecer as ins-trues de cada um dos drivers dos respectivos bancos que ele for utilizar.

    Para facilitar o trabalho do desenvolvedor da aplicao, a Microsoft definiu uma especificaochamada 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 especificao com o intuito de populariz-lo.

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

    ODBC ManagerPara 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 Mana-ger do Windows. O ODBC Manager pode ser executado atravs do item Ferramentas Administrati-vas do Painel de Controle.

    www.facebook.com/k19treinamentos 25

  • ADO.NET 26

    Criando uma conexoCom o driver de conexo ODBC instalado na mquina j possvel criar uma conexo com o bancode dados correspondente. O que necessrio para estabelecer uma conexo com o banco 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;";

    Cdigo C# 2.1: Definindo a string de conexo

    Aps a definio da string de conexo, podemos utilizar a classe System.Data.Odbc.OdbcConnec-tion do .NET Framework. Essa classe responsvel por criar conexes ODBC.

    1 OdbcConnection conexao = new OdbcConnection(stringDeConexao);

    Cdigo C# 2.2: Criando uma conexo ODBC

    Inserindo registrosEstabelecida a conexo com o banco de dados, j podemos executar comandos. Por exemplo, pos-svel inserir registros nas tabelas. O primeiro passo para executar um comando defini-lo em lin-guagem SQL de acordo com a sintaxe do SGDB utilizado.

    26 www.k19.com.br

  • 27 ADO.NET

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

    Mais SobreO caractere @ antes de um valor literal do tipo string indica que os caracteres dentroda string no devem ser processados como caracteres especiais.

    Em seguida, devemos criar um objeto da classe System. Data.Odbc.OdbcCommand a partir docdigo sql e da conexo previamente criados. O comando no executado quando os objetos dessaclasse so instanciados.

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

    Cdigo C# 2.4: Criando um comando ODBC

    Por fim, o comando pode ser executado atravs do mtodo ExecuteNonQuery(). A conexo deveser aberta antes de executar o comando.

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

    ImportanteA mesma conexo pode ser reaproveitada para executar vrias operaes. Quando nohouver mais operaes a serem executadas, devemos finalizar a conexo ODBC atravs

    do mtodo Close(). Finalizar as conexes ODBC que no so mais necessrias importantepois libera recursos no SGBD.

    1 conexao.close();

    Cdigo C# 2.6: Finalizando uma conexo ODBC

    Mais SobreEm C#, para evitar que o uma conexo no seja fechada aps a sua utilizao, podemosaplicar um bloco using.

    1 using (OdbcConnection conexao = new OdbcConnection(stringDeConexao))2 {3 // utiliza a conexao4 }

    Cdigo C# 2.7: Utilizando um bloco using

    No cdigo acima, quando o bloco using que est associado conexo ODBC terminar, automa-ticamente, essa conexo ser fechada.

    Exerccios de Fixao

    www.facebook.com/k19treinamentos 27

  • ADO.NET 28

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

    2 Crie uma classe chamada InsereEditora no projeto ODBC para inserir registros na tabela Edi-toras.

    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;";1112 System.Console.Write("Digite o Nome da Editora:");13 string nome = System.Console.ReadLine ();1415 System.Console.Write("Digite o Email da Editora:");16 string email = System.Console.ReadLine ();1718 string textoInsereEditora =19 @"INSERT INTO Editoras (Nome , Email)20 VALUES(" + nome + @", " + email + @")";2122 using (OdbcConnection conexao = new OdbcConnection(stringDeConexao))23 {24 OdbcCommand command = new OdbcCommand(textoInsereEditora , conexao);25 conexao.Open();26 command.ExecuteNonQuery ();27 }28 }29 }30 }

    Cdigo C# 2.8: InsereEditora.cs

    Exerccios Complementares

    1 Crie uma classe chamada InsereLivro no projeto ODBC para inserir registros na tabela Livros.

    SQL InjectionA implementao da insero de registros feita anteriormente possui uma falha grave. Os dados ob-tidos do usurio atravs do teclado no so tratados antes de serem enviados para o SGDB.

    Esses dados podem conter caracteres especiais. Se esses caracteres no so tratados, o compor-tamento esperado da operao afetado. Eventualmente, registros no so inseridos como deveriamou brechas de segurana podem se abrir.

    Por exemplo, considere a classe InsereEditora do exerccio de fixao. Se o usurio digitar

    28 www.k19.com.br

  • 29 ADO.NET

    OReilly e [email protected], o cdigo SQL gerado pela aplicao seria:

    1 INSERT INTO Editoras (nome , email) VALUES (OReilly , [email protected] )

    Observe que o caractere aspas simples aparece cinco vezes no cdigo SQL acima. O SGDB nosaberia dizer onde de fato termina o nome da editora. Ao tentar executar esse cdigo, um erro desintaxe lanado pelo SQL Server. Para resolver esse problema manualmente, devemos adicionardois caracteres seguidos.

    1 INSERT INTO Editoras (nome , email) VALUES (OReilly , [email protected] )

    Os valores recebidos dos usurios devem ser analisados e os caracteres especiais contidos nessesvalores devem ser tratados. Esse processo extremamente trabalhoso, pois o conjunto de caracteresespeciais e a forma de trat-los diferente em cada SGDB.

    A responsabilidade do tratamento dos caracteres especiais contidos nos valores de entrada dosusurios pode ser repassada para os drivers ODBC. Dessa forma, o cdigo das aplicaes se tornaindependente das particularidades desse processo para cada SGDB.

    Mais SobreO processo de tratamento dos caracteres especiais das entradas dos usurios denomi-nado sanitize.

    1 // pegando os dados da editora pelo teclado2 string nome = System.Console.ReadLine ();3 string email = System.Console.ReadLine ();45 // definindo a sentena SQL com parmetros6 string textoDoComando =7 @"INSERT INTO Editoras (Nome , Email) VALUES (?, ?);";89 // criando um comando odbc10 OdbcCommand comando = new OdbcCommand(textoDoComando , conexao);1112 // atribuindo valores aos parmetros13 comando.Parameters.AddWithValue("@Nome", nome);14 comando.Parameters.AddWithValue("@Email", email);

    Cdigo C# 2.12: Sanitizando as entradas dos usurios

    Observe que a sentena SQL foi definida com parmetros atravs do caractere ?. Antes de exe-cutar o comando, necessrio atribuir valores aos parmetros. Isso feito com o mtodo AddWith-Value(). Esse mtodo realiza a tarefa de sanitizar os valores enviados pelo usurio.

    Exerccios de Fixao

    3 Tente causar um erro de SQL Injection ao inserir editoras com a classe InsereEditora. (Dica:tente entradas com aspas simples)

    www.facebook.com/k19treinamentos 29

  • ADO.NET 30

    4 Altere o cdigo da classe InsereEditora para eliminar o problema do SQL Injection. Observe ocdigo abaixo:

    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;";1112 System.Console.Write("Digite o Nome da Editora:");13 string nome = System.Console.ReadLine ();1415 System.Console.Write("Digite o Email da Editora:");16 string email = System.Console.ReadLine ();1718 string textoInsereEditora =19 @"INSERT INTO Editoras (Nome , Email) VALUES (?,?)";2021 using (OdbcConnection conexao = new OdbcConnection(stringDeConexao))22 {23 OdbcCommand command = new OdbcCommand(textoInsereEditora , conexao);2425 command.Parameters.AddWithValue("@Nome", nome);26 command.Parameters.AddWithValue("@Email", email);2728 conexao.Open();29 command.ExecuteNonQuery ();30 }31 }32 }33 }

    Cdigo C# 2.13: InsereEditora.cs

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

    Exerccios Complementares

    2 Provoque um erro de SQL Injection na classe InsereLivro. (Dica: tente entradas com aspassimples.)

    3 Altere o cdigo para eliminar o problema do SQL Injection.

    4 Agora tente causar novamente o problema de SQL Injection ao inserir novos livros.

    Listando registrosDepois de inserir alguns registros, interessante consultar os dados das tabelas para conferir se a in-sero foi realizada com sucesso.

    30 www.k19.com.br

  • 31 ADO.NET

    O processo para executar um comando de consulta parecido com o de insero. necessriodefinir 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);

    Cdigo C# 2.15: Criando um comando de seleo

    A diferena que para executar um comando de consulta necessrio utilizar o mtodo Execu-teReader() ao invs do ExecuteNonQuery(). Esse mtodo devolve um objeto da classe System.Da-ta.Odbc.OdbcDataReader.

    1 OdbcDataReader resultado = comando.ExecuteReader ();

    Cdigo C# 2.16: Executando um comando de consulta

    Os dados contidos no OdbcDataReader podem ser acessados atravs dos nomes das colunas.

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

    Cdigo C# 2.17: Recuperando os campos do primeiro registro do resultado

    O cdigo acima mostra como os campos do primeiro registro do resultado da consulta so recu-perados. Agora, para recuperar os outros registros necessrio avanar o OdbcDataReader atravsdo mtodo 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;

    Cdigo C# 2.18: Recuperando os campos dos dois primeiros registros do resultado

    O prprio mtodo Read() devolve um valor booleano para indicar se o reader conseguiu avanarpara o prximo registro. Quando esse mtodo devolver false significa que no h mais registrospara serem recuperados.

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

    Cdigo C# 2.19: Recuperando os campos de todos os registros do resultado

    Exerccios de Fixao

    www.facebook.com/k19treinamentos 31

  • ADO.NET 32

    6 Insira algumas editoras utilizando a classe InsereEditora que voc criou nos exerccios anteri-ores.

    7 Adicione uma nova classe ao projeto ODBC chamada ListaEditora. O objetivo listar as edi-toras que foram salvas no banco. Veja o cdigo dessa classe.

    1 using System.Data.Odbc;23 namespace Odbc4 {5 class ListaEditora6 {7 static void Main(string [] args)8 {9 string stringDeConexao = @"driver ={SQL Server };10 server=MARCELO -PC\SQLEXPRESS;database=livraria;uid=sa;pwd=sa;";1112 using (OdbcConnection conexao = new OdbcConnection(stringDeConexao))13 {14 string textoListaEditora = "SELECT * FROM Editoras";15 OdbcCommand command = new OdbcCommand(textoListaEditora , conexao);16 conexao.Open();17 OdbcDataReader resultado = command.ExecuteReader ();1819 while (resultado.Read())20 {21 long? id = resultado["Id"] as long?;22 string nome = resultado["Nome"] as string;23 string email = resultado["Email"] as string;24 System.Console.WriteLine("{0} : {1} - {2}\n",id,nome ,email);25 }26 }27 }28 }29 }

    Cdigo C# 2.20: ListaEditora.cs

    Exerccios Complementares

    5 Crie uma classe para listar os livros cadastrados na base de dados.

    Connection Factory

    Voc deve ter percebido que para cada ao executada no banco de dados, ns precisamos criaruma conexo. Isso gera um problema relacionado string de conexo ficar armazenada em diversoslocais. Imagine que o driver do banco foi atualizado e mudamos a sua verso. Isso implicaria fa-zer diversas alteraes no cdigo em cada ocorrncia da string de conexo, tornando o cdigo maissuscetvel a erros e dificultando a sua manuteno.

    Para resolver esta situao, ns poderamos criar uma classe responsvel pela criao e distri-buio de conexes, mantendo assim uma nica referncia para a string de conexo, e qualqueralterao no modo em que nos conectamos base de dados, s implica mudanas nesta classe.

    32 www.k19.com.br

  • 33 ADO.NET

    1 static class ConnectionFactory2 {3 public static OdbcConnection CreateConnection ()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 }

    Cdigo C# 2.22: ConnectionFactory.cs

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

    Exerccios de Fixao

    8 Adicione uma nova classe chamada ConnectionFactory com seguinte cdigo:

    1 using System;2 using System.Data.Odbc;3 using System.Text;45 namespace Odbc6 {7 static class ConnectionFactory8 {9 public static OdbcConnection CreateConnection ()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=");

    www.facebook.com/k19treinamentos 33

  • ADO.NET 34

    27 connectionString.Append(senha);2829 return new OdbcConnection(connectionString.ToString ());30 }31 }32 }

    Cdigo C# 2.23: ConnectionFactory.cs

    9 Altere as classes InsereEditora e ListaEditora para que elas utilizem a fbrica de conexo.Execute-as novamente.

    1 using System.Data.Odbc;23 namespace Odbc4 {5 class InsereEditora6 {7 static void Main(string [] args)8 {9 System.Console.Write("Digite o Nome da Editora:");10 string nome = System.Console.ReadLine ();1112 System.Console.Write("Digite o Email da Editora:");13 string email = System.Console.ReadLine ();1415 string textoInsereEditora =16 @"INSERT INTO Editoras (Nome , Email) VALUES (?,?)";1718 using (OdbcConnection conexao = ConnectionFactory.CreateConnection ())19 {20 OdbcCommand command = new OdbcCommand(textoInsereEditora , conexao);2122 command.Parameters.AddWithValue("@Nome", nome);23 command.Parameters.AddWithValue("@Email", email);2425 conexao.Open();26 command.ExecuteNonQuery ();27 }28 }29 }30 }

    Cdigo C# 2.24: InsereEditora.cs

    1 using System.Data.Odbc;23 namespace Odbc4 {5 class ListaEditora6 {7 static void Main(string [] args)8 {9 using (OdbcConnection conexao = ConnectionFactory.CreateConnection ())10 {11 string textoListaEditora = "SELECT * FROM Editoras";12 OdbcCommand command = new OdbcCommand(textoListaEditora , conexao);13 conexao.Open();14 OdbcDataReader resultado = command.ExecuteReader ();1516 while (resultado.Read())17 {18 long? id = resultado["Id"] as long?;19 string nome = resultado["Nome"] as string;20 string email = resultado["Email"] as string;21 System.Console.WriteLine("{0} : {1} - {2}\n",id,nome ,email);

    34 www.k19.com.br

  • 35 ADO.NET

    22 }23 }24 }25 }26 }

    Cdigo C# 2.25: ListaEditora.cs

    Exerccios Complementares

    6 Altere as classes InsereLivro e ListaLivropara que elas utilizem a fbrica de conexo. Execute-as novamente.

    Desafios

    1 Implemente um teste que remove uma editora pelo id.

    2 Implemente um teste que altera os dados de uma editora pelo id.

    www.facebook.com/k19treinamentos 35

  • ADO.NET 36

    36 www.k19.com.br

  • ENTITY FRAMEWORK

    CA

    P

    TU

    LO

    3Mltiplas sintaxes da linguagem SQL

    No captulo anterior, utilizamos conexes ODBC para fazer uma aplicao C# interagir com osSGDBs. Nessa interao, as consultas so definidas com a linguagem SQL. A sintaxe dessa linguagem diferente em cada SGDB. Dessa forma, a complexidade do trabalho dos desenvolvedores aumenta.Para resolver esse problema, as consultas deveriam ser definidas atravs de um mecanismo indepen-dente da linguagem SQL.

    Drive

    rOra

    cle

    ODB

    C

    SELECT * FROM (SELECT

    ROW_NUMBER() OVER (ORDER BY autor ASC) AS rownumber,id, titulo, autor

    FROM livros) WHERE rownumber

  • ENTITY FRAMEWORK 38

    o modelo orientado a objetos.

    A transio de dados entre o modelo relacional e o modelo orientado a objetos no simples.Para realizar essa transio, necessrio definir um mapeamento entre os conceitos desses dois pa-radigmas. Por exemplo, classes podem ser mapeadas para tabelas, objetos para registros, atributospara campos e referncia entre objetos para chaves estrangeiras.

    tbl_livros

    id

    1

    2

    3

    4

    titulo

    Os Lusadas

    Vidas Secas

    Dom Casmurro

    O Cortio

    autor

    Lus Vaz de Cames

    Graciliano Ramos

    Machado de Assis

    Alusio Azevedo

    editora_id

    1

    1

    3

    2

    tbl_editoras

    id

    1

    2

    3

    4

    nome

    Cultura

    FTDA

    Globo

    Scipione

    MODELO RELACIONAL

    Editora

    id = 1nome = Livraria Cultura

    Livro

    id = 1titulo = Os Lusadasautor = Lus Vaz de Cameseditora = 1

    Livro

    id = 2titulo = Vidas Secasautor = Graciliano Ramoseditora = 1

    ORIENTAO A OBJETOS

    Figura 3.2: Modelo Orientado a Objetos vs Modelo Relacional

    Ferramentas ORM

    Para facilitar a comunicao entre aplicaes C# que seguem o modelo orientado a objetos e osSGDBs que seguem o modelo relacional, podemos utilizar ferramentas que automatizam a transiode dados entre as aplicaes e os SGDBs. Essas ferramentas so conhecidas como ferramentas ORM(Object Relational Mapper).

    As ferramentas ORM oferecem mecanismos de consultas independentes da linguagem SQL. Dessaforma, o acoplamento entre as aplicaes e os SGDBs diminui drasticamente. As principais ferra-mentas ORM para C# utilizadas no mercado so o Entity Framework e o NHibernate. Nesse curso,utilizaremos o Entity Framework 5.0.0.

    38 www.k19.com.br

  • 39 ENTITY FRAMEWORK

    Livro

    id = 1titulo = Os Lusadasautor = Lus Vaz de Cameseditora = 1

    Livro

    id = 2titulo = Vidas Secasautor = Graciliano Ramoseditora = 1

    tbl_livros

    id

    1

    2

    3

    4

    titulo

    Os Lusadas

    Vidas Secas

    Dom Casmurro

    O Cortio

    autor

    Lus Vaz de Cames

    Graciliano Ramos

    Machado de Assis

    Alusio Azevedo

    editora_id

    1

    1

    3

    2

    FERRAMENTAORM

    Figura 3.3: Transformao dos dados do Modelo Relacional para o Modelo Orientado a Objetos

    Livro

    id = 1titulo = Os Lusadasautor = Lus Vaz de Cameseditora = 1

    Livro

    id = 2titulo = Vidas Secasautor = Graciliano Ramoseditora = 1

    tbl_livros

    id

    1

    2

    3

    4

    titulo

    Os Lusadas

    Vidas Secas

    Dom Casmurro

    O Cortio

    autor

    Lus Vaz de Cames

    Graciliano Ramos

    Machado de Assis

    Alusio Azevedo

    editora_id

    1

    1

    3

    2

    FERRAMENTAORM

    Figura 3.4: Transformao dos dados do Modelo Orientado a Objetos para o Modelo Relacional

    Instalando o Entity Framework

    A instalao do Entity Framework em um projeto do Visual Studio 2012 pode ser facilmenterealizada atravs do Package Manager Console. Veja o comando de instalao a seguir.

    PM> Install -Package EntityFramework -Version 5.0.0

    Terminal 3.1: Package Manager Console

    Mais SobreO Entity Framework tambm pode ser instalado atravs do Manage NuGet Packa-ges. Basicamente, o Manage NuGet Packages a alternativa visual ao Package Manager

    Console.

    www.facebook.com/k19treinamentos 39

  • ENTITY FRAMEWORK 40

    Figura 3.5: Manage NuGet Package

    Figura 3.6: Manage NuGet Package

    Configurao

    O Entity Framework fortemente baseado no conceito de Conveno sobre Configurao. Dessaforma, nenhuma configurao necessria a no ser que seja necessrio alterar o comportamentopadro.

    No comportamento padro do Entity Framework, as conexes com o banco de dados apontaropara .\ SQLEXPRESS, ou seja, para a instncia do SQL Express rodando na mesma mquina que a

    40 www.k19.com.br

  • 41 ENTITY FRAMEWORK

    aplicao.

    Para alterar as configuraes de conexo com o banco de dados, podemos defini-las no arquivode configurao da aplicao. Para aplicaes web, devemos alterar o arquivo Web.config. Por outrolado, para aplicaes desktop, devemos alterar o arquivo App.config. Veja o exemplo abaixo.

    1 2 3 4 14 15

    Cdigo XML 3.1: App.config

    Quando o Entity Framework instalado em um projeto do Visual Studio 2012, as configuraespadro so inseridas explicitamente no arquivo de configurao da aplicao. Contudo, essas confi-guraes so opcionais. Inclusive, podemos remov-las e mesmo assim elas sero aplicadas.

    Convenes de Mapeamento

    Por padro, no Entity Framework, o mapeamento das entidades segue as regras do Code First.Considere as entidades Livro e Editora definidas abaixo.

    1 public class Livro2 {3 public int LivroID { get; set; }4 public string Titulo { get; set; }5 public decimal Preco { get; set; }6 public Editora Editora { get; set; }7 }

    Cdigo C# 3.1: Livro.cs

    1 public class Editora2 {3 public int EditoraID { get; set; }4 public string Nome { get; set; }5 public string Email { get; set; }6 public ICollection Livros { get; set; }7 }

    Cdigo C# 3.2: Editora.cs

    As entidades devem ser registradas em um DbContext. Para registrar uma entidade, basta de-finir uma propriedade do tipo DbSet. Veja o exemplo abaixo.

    1 public namespace EF2 {3 public class K19Context : DbContext

    www.facebook.com/k19treinamentos 41

  • ENTITY FRAMEWORK 42

    4 {5 public DbSet Editoras { get; set; }6 public DbSet Livros { get; set; }7 }8 }

    Cdigo C# 3.3: K19Context.cs

    De acordo com as convenes do Code First, as entidades Editora e Livro sero mapeadaspara tabelas chamadas Editoras e Livroes respectivamente. Observe que os nomes das entidadesforam pluralizados seguindo as regras da lngua inglesa para definir os nomes das tabelas.

    Alm disso, por padro, essas tabelas sero criadas em uma base de dados chamada EF.K19Context.Esse nome corresponde ao full qualified name da classe K19Context.

    Mais SobrePara desabilitar a pluralizao aplicada no nome das tabelas, necessrio sobrescrevero mtodo OnModelCreating() da classe DbContext.

    1 public class K19Context : DbContext2 {3 public DbSet Editoras { get; set; }4 public DbSet Livros { get; set; }56 protected override void OnModelCreating( DbModelBuilder dbModelBuilder)7 {8 dbModelBuilder.Conventions.Remove ();9 }

    10 }

    Cdigo C# 3.4: K19Context.cs

    Mais SobreNas prximas verses do Entity Framework, as regras de pluralizao podero ser perso-nalizadas. Dessa forma, ser possvel, por exemplo, substituir as regras da lngua inglesa

    pelas regras da lngua portuguesa.

    Mais SobrePodemos modificar o nome da base de dados escolhido por padro. Para isso, bastaadicionar um construtor na classe que define o DbContext semelhante ao mostrado

    no cdigo abaixo.

    1 public class K19Context : DbContext2 {3 public DbSet Editoras { get; set; }4 public DbSet Livros { get; set; }56 public K19Context () : base("MinhaBaseDeDados")7 {8 }9 }

    Cdigo C# 3.5: K19Context.cs

    42 www.k19.com.br

  • 43 ENTITY FRAMEWORK

    Primary Key

    O Entity Framework assumir como identificador de uma entidade, a propriedade cujo nomeseja ID ou EntidadeID escrito com letras maisculas e/ou minsculas. Essa propriedade ser mape-ada para uma coluna definida no banco de dados como chave primria da tabela correspondente aentidade. Veja os exemplos abaixo.

    1 public class Livro2 {3 public int LivroID { get; set; }4 }

    Cdigo C# 3.6: Livro.cs

    1 public class Livro2 {3 public int ID { get; set; }4 }

    Cdigo C# 3.7: Livro.cs

    Se o tipo da propriedade utilizada como identificador de uma entidade for numrico, os valoresda coluna correspondente a essa propriedade sero gerados pelo banco de dados. Isso significa que,no SQL Server, a coluna ser definida com a opo Identity.

    Complex Types

    Considere a seguinte entidade.

    1 public class Contato2 {3 public int ContatoID { get; set; }45 public string LogradouroResidencial { get; set; }6 public string LogradouroComercial { get; set; }78 public string CEPResidencial { get; set; }9 public string CEPComercial { get; set; }1011 public String BairroResidencial { get; set; }12 public String BairroComercial { get; set; }13 }

    Cdigo C# 3.8: Contato.cs

    Do ponto de vista da modelagem orientada a objetos, deveramos refatorar essa classe separandoas propriedades relacionadas aos endereos de um contato.

    1 public class Contato2 {3 public int ContatoID { get; set; }45 public Endereco EnderecoResidecial { get; set;}6 public Endereco EnderecoComercial { get; set;}7 }

    Cdigo C# 3.9: Contato.cs

    1 public class Endereco2 {

    www.facebook.com/k19treinamentos 43

  • ENTITY FRAMEWORK 44

    3 public string Logradouro { get; set;}4 public string CEP { get; set;}5 public string Bairro { get; set;}6 }

    Cdigo C# 3.10: Endereco.cs

    Como nenhuma propriedade da classe Endereco se enquadra nas convenes de Primary Key esupondo que nenhuma propriedade tenha sido mapeada explicitamente para uma coluna definidacomo chave primria, o Entity Framework assumir que essa classe um Complex Type. Alm disso,um Complex Type no pode referenciar uma entidade atravs de uma propriedade.

    As classes Contato e Endereco sero mapeadas para uma nica tabela chamada Contatoes. Essatabela possuir a estrutura mostrada na imagem a seguir.

    Figura 3.7: Mapeamento das classes Contato e Endereco

    Mapeamento dos Relacionamentos

    Considere as seguintes entidades.

    1 public class Livro2 {3 public int LivroID { get; set; }45 public Editora Editora { get; set; }6 }

    Cdigo C# 3.11: Livro.cs

    1 public class Editora2 {3 public int EditoraID { get; set; }4 }

    Cdigo C# 3.12: Editora.cs

    Essas duas entidades sero mapeadas para as tabelas Livroes e Editoras. Na tabela Livroes,ser adicionada uma chave estrangeira chamada Editora_EditoraID referenciado a chave primriada tabela Editora. Observe na imagem abaixo a estrutura das tabelas.

    44 www.k19.com.br

  • 45 ENTITY FRAMEWORK

    Figura 3.8: Mapeamento das entidades Livro e Editora

    As mesmas tabelas seriam obtidas se o relacionamento fosse definido na entidade Editora aoinvs de ser definido na entidade Livro.

    1 public class Livro2 {3 public int LivroID { get; set; }4 }

    Cdigo C# 3.13: Livro.cs

    1 public class Editora2 {3 public int EditoraID { get; set; }45 public ICollection Livros { get; set; }6 }

    Cdigo C# 3.14: Editora.cs

    Tambm obteramos as mesmas tabelas se o relacionamento fosse definido em ambas entidades.

    1 public class Livro2 {3 public int LivroID { get; set; }45 public Editora Editora { get; set; }6 }

    Cdigo C# 3.15: Livro.cs

    1 public class Editora2 {3 public int EditoraID { get; set; }45 public ICollection Livros { get; set; }6 }

    Cdigo C# 3.16: Editora.cs

    Por outro lado, se na entidade Livro uma coleo de editoras for definida como propriedade ede forma anloga uma coleo de livros for definida como propriedade na entidade Editora entouma terceira tabela ser criada no banco de dados para representar esse relacionamento muitospara muitos (many to many).

    1 public class Livro2 {

    www.facebook.com/k19treinamentos 45

  • ENTITY FRAMEWORK 46

    3 public int LivroID { get; set; }45 public ICollection Editoras { get; set; }6 }

    Cdigo C# 3.17: Livro.cs

    1 public class Editora2 {3 public int EditoraID { get; set; }45 public ICollection Livros { get; set; }6 }

    Cdigo C# 3.18: Editora.cs

    Figura 3.9: Mapeamento das entidades Livro e Editora

    Type Discovery

    Quando duas entidades esto relacionadas, no necessrio que ambas sejam registradas noDbContext. Apenas a entidade principal necessita ser registrada. Por exemplo, considere as seguin-tes entidades.

    1 public class Livro2 {3 public int LivroID { get; set; }4 }

    Cdigo C# 3.19: Livro.cs

    1 public class Editora2 {3 public int EditoraID { get; set; }45 public ICollection Livros { get; set; }6 }

    Cdigo C# 3.20: Editora.cs

    No DbContext da aplicao, podemos registrar ambas ou apenas a entidade Editora.

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

    Cdigo C# 3.21: K19Context.cs

    1 public class K19Context : DbContext2 {3 public DbSet Editoras { get; set; }

    46 www.k19.com.br

  • 47 ENTITY FRAMEWORK

    4 }

    Cdigo C# 3.22: K19Context.cs

    Se as duas entidades forem registradas, tanto os livros quanto as editoras podem ser obtidos di-retamente pelo DbContext. Agora, se apenas a entidade Editora for registrada, somente as editoraspodem ser obtidas diretamente pelo DbContext e os livros seriam obtidos somente atravs das edi-toras.

    Exerccios de Fixao

    1 Abra o Visual Studio Express 2012 for Desktop; Crie um projeto do tipo Console Application emC# chamado K19EntityFramework.

    2 Instale o Entity Framework no projeto K19EntityFramework utilizando o Manage Nuget Packages.Siga o exemplo das imagens abaixo.

    Figura 3.10: Manage NuGet Package

    www.facebook.com/k19treinamentos 47

  • ENTITY FRAMEWORK 48

    Figura 3.11: Manage NuGet Package

    3 Adicione uma classe chamada Endereco no projeto K19EntityFramework.

    1 namespace K19EntityFramework2 {3 // complex type4 public class Endereco5 {6 public string Logradouro { get; set; }78 public int Numero { get; set; }910 public string CEP { get; set; }11 }12 }

    Cdigo C# 3.23: Endereco.cs

    4 Adicione uma classe chamada Aluno no projeto K19EntityFramework.

    1 namespace K19EntityFramework2 {3 public class Aluno4 {5 public int AlunoID { get; set; }67 public string Nome { get; set; }89 public Endereco Endereco { get; set; }10 }11 }

    Cdigo C# 3.24: Aluno.cs

    48 www.k19.com.br

  • 49 ENTITY FRAMEWORK

    5 Adicione uma classe chamada Professor no projeto K19EntityFramework.

    1 namespace K19EntityFramework2 {3 public class Professor4 {5 public int ProfessorID { get; set; }67 public string Nome { get; set; }89 public Endereco Endereco { get; set; }10 }11 }

    Cdigo C# 3.25: Professor.cs

    6 Adicione uma classe chamada Turma no projeto K19EntityFramework.

    1 namespace K19EntityFramework2 {3 public class Turma4 {5 public int TurmaId { get; set; }67 public int Vagas { get; set; }89 public Professor Professor { get; set; }1011 public ICollection Alunos { get; set; }12 }13 }

    Cdigo C# 3.26: Turma.cs

    7 Adicione uma classe chamada K19Context no projeto K19EntityFramework.

    1 namespace K19EntityFramework2 {3 public class K19Context : DbContext4 {5 public DbSet Turmas { get; set; }67 public DbSet Alunos { get; set; }89 public DbSet Professores { get; set; }10 }11 }

    Cdigo C# 3.27: Turma.cs

    8 Adicione uma classe chamada Teste no projeto K19EntityFramework.

    1 namespace K19EntityFramework2 {3 public class Teste4 {5 static void Main(string [] args)6 {7 using (var ctx = new K19Context ())8 {9 Aluno a1 = new Aluno

    www.facebook.com/k19treinamentos 49

  • ENTITY FRAMEWORK 50

    10 {11 Nome = "Amanda Guerra",12 Endereco = new Endereco13 {14 Logradouro = "Rua Amalera",15 Numero = 1789,16 CEP = "00157 -001"17 }18 };1920 Aluno a2 = new Aluno21 {22 Nome = "Marcelo Martins",23 Endereco = new Endereco24 {25 Logradouro = "Rua Zaul",26 Numero = 2907,27 CEP = "09147 -001"28 }29 };3031 Professor p = new Professor32 {33 Nome = "Jonas Hirata",34 Endereco = new Endereco35 {36 Logradouro = "Rua Mervelha",37 Numero = 8367,38 CEP = "00876 -100"39 }40 };4142 Turma t = new Turma43 {44 Vagas = 10,45 Alunos = new List ()46 };4748 t.Professor = p;49 t.Alunos.Add(a1);50 t.Alunos.Add(a2);5152 ctx.Turmas.Add(t);53 ctx.SaveChanges ();54 }55 }56 }57 }

    Cdigo C# 3.28: Teste.cs

    9 Execute o projeto K19EntityFramework e consulte o banco de dados para verificar se os dadosforam armazenados corretamente. Observe a estrutura das tabelas.

    Data Annotations

    Podemos utilizar anotaes para sobrescrever as convenes de mapeamento. A seguir apresen-taremos as principais anotaes.

    50 www.k19.com.br

  • 51 ENTITY FRAMEWORK

    Table e Column

    No Entity Framework, os nomes das tabelas e das colunas so definidos por conveno. Contudo,podemos personaliz-los de acordo com a necessidade atravs das anotaes Table e Column.

    1 [Table("tbl_alunos")]2 public class Aluno3 {4 public int AlunoID { get; set; }56 [Column("nome_do_aluno")]7 public string Nome { get; set; }8 }

    Cdigo C# 3.29: Aluno.cs

    Figura 3.12: Personalizando os nomes das tabelas e das colunas

    A anotao Column tambm permite a escolha do tipo da coluna correspondente propriedadeanotada.

    1 public class Produto2 {3 public int ProdutoID { get; set; }45 [Column("descricao_do_produto", TypeName="text")]6 public string Descricao { get; set; }7 }

    Cdigo C# 3.30: Produto.cs

    Figura 3.13: Personalizando o tipo de uma coluna

    DatabaseGenerated

    Por padro, quando a propriedade correspondente chave primria de uma tabela numrica,os valores dessa chave sero gerados pelo banco de dados. Podemos alterar esse comportamentoatravs da anotao DatabaseGenerated.

    1 public class Aluno2 {3 [DatabaseGenerated(DatabaseGeneratedOption.None)]4 public int AlunoID { get; set; }56 public string Nome { get; set; }7 }

    Cdigo C# 3.31: Aluno.cs

    www.facebook.com/k19treinamentos 51

  • ENTITY FRAMEWORK 52

    Key

    Considere a seguinte classe.

    1 public class Aluno2 {3 public int Codigo { get; set; }45 public string Nome { get; set; }6 }

    Cdigo C# 3.32: Aluno.cs

    Nenhuma propriedade se enquadra nas convenes de nomenclatura de chave primria. Con-tudo, possvel definir explicitamente, qual propriedade ser mapeada como chave primria atravsda anotao Key. No exemplo abaixo, a propriedade Codigo foi definida como chave da entidade.

    1 public class Aluno2 {3 [Key]4 public int Codigo { get; set; }56 public string Nome { get; set; }7 }

    Cdigo C# 3.33: Aluno.cs

    Figura 3.14: Escolhendo a chave primria explicitamente

    Required

    Uma propriedade pode ser definida explicitamente como obrigatria atravs da anotao Requi-red. No banco de dados, as colunas correspondentes s propriedades obrigatrias sero definidascom a opo not null.

    1 public class Aluno2 {3 public int AlunoID { get; set; }45 [Required]6 public string Nome { get; set; }7 }

    Cdigo C# 3.34: Aluno.cs

    Figura 3.15: Definindo propriedades obrigatrias

    MaxLength e MinLength

    52 www.k19.com.br

  • 53 ENTITY FRAMEWORK

    1 public class Aluno2 {3 public int AlunoID { get; set; }45 [MaxLength (30), MinLength (3)]6 public string Nome { get; set; }7 }

    Cdigo C# 3.35: Aluno.cs

    Figura 3.16: Definindo a quantidade mnima e mxima de caracteres de uma propriedade

    NotMapped

    Considere a seguinte classe.

    1 public class Aluno2 {3 public int AlunoID { get; set; }45 public DateTime DataDeNascimento { get; set; }67 public int Idade { get; set; }89 }

    Cdigo C# 3.36: Aluno.cs

    Observe que a propriedade Idade pode ser calculada a partir da propriedade DataDeNascimento.Portanto, no necessrio armazenar o valor da idade no banco de dados. Nesses casos, podemosutilizar a anotao NotMapped e indicar quais propriedades no devem ser mapeadas nas tabelas.

    1 public class Aluno2 {3 public int AlunoID { get; set; }45 public DateTime DataDeNascimento { get; set; }67 [NotMapped]8 public int Idade { get; set; }910 }

    Cdigo C# 3.37: Aluno.cs

    Figura 3.17: Excluindo uma propriedade no mapeamento

    InverseProperty

    Considere as seguintes entidades.

    www.facebook.com/k19treinamentos 53

  • ENTITY FRAMEWORK 54

    1 public class Pessoa2 {3 public int PessoaID { get; set; }45 public string Nome { get; set; }67 public ICollection LivrosPublicados { get; set; }89 public ICollection LivrosRevisados { get; set; }10 }

    Cdigo C# 3.38: Pessoa.cs

    1 public class Livro2 {3 public int LivroID { get; set; }45 public string Titulo { get; set; }67 public Pessoa Autor { get; set; }89 public Pessoa Revisor { get; set; }10 }

    Cdigo C# 3.39: Livro.cs

    Nesse caso, como o Entity Framework no consegue combinar as propriedades das duas entida-des para estabelecer dois relacionamentos bidirecionais, ele criar no banco de dados quatro chavesestrangeiras, uma para cada propriedade de navegao das entidades Pessoa e Livro.

    Figura 3.18: Relacionamentos no combinados

    Para agrupar as propriedades de navegao das entidades Pessoa e Livro, devemos utilizar aanotao InverseProperty. Observe o cdigo a seguir.

    1 public class Pessoa2 {3 public int PessoaID { get; set; }45 public string Nome { get; set; }67 [InverseProperty("Autor")]8 public ICollection LivrosPublicados { get; set; }910 [InverseProperty("Revisor")]11 public ICollection LivrosRevisados { get; set; }12 }

    Cdigo C# 3.40: Pessoa.cs

    1 public class Livro

    54 www.k19.com.br

  • 55 ENTITY FRAMEWORK

    2 {3 public int LivroID { get; set; }45 public string Titulo { get; set; }67 public Pessoa Autor { get; set; }89 public Pessoa Revisor { get; set; }10 }

    Cdigo C# 3.41: Livro.cs

    Figura 3.19: Relacionamentos combinados com InverseProperty

    Exerccios de Fixao

    10 Altere a classe Aluno do projeto K19EntityFramework.

    1 namespace K19EntityFramework2 {3 [Table("tbl_alunos")]4 public class Aluno5 {6 public int AlunoID { get; set; }78 [Required]9 public string Nome { get; set; }1011 public Endereco Endereco { get; set; }12 }13 }

    Cdigo C# 3.42: Aluno.cs

    11 Apague a base de dados K19EntityFramework.K19Context e execute novamente o projeto. Ob-serve as modificaes na estrutura da tabela Alunoes que passar a se chamar tbl_alunos. Observeque agora a coluna Nome no pode possuir valores nulos.

    Gerenciamento de entidades

    As instncias das entidades de uma aplicao que utiliza o Entity Framework so administradaspor objetos do tipo DbContext. Esses objetos so responsveis pelas operaes de insero, remoo,alterao e consulta. A seguir, mostraremos o funcionamento bsico de um DbContext.

    www.facebook.com/k19treinamentos 55

  • ENTITY FRAMEWORK 56

    A primeira regra bsica sobre os DbContexts sempre utiliz-los dentro de um bloco using paraevitar que os recursos utilizados por eles no sejam devidamente fechados.

    1 using (var context = new K19Context ())2 {3 // utilizando o DbContext4 }

    Cdigo C# 3.43: Utilizando um DbContext dentro do bloco using

    Persistindo

    Para indicar que determinado objeto deve ser persistido no banco de dados, devemos utilizaro mtodo System.Data.Entity.DbSet.Add(), passando o objeto em questo como parmetro. Omtodo Add() adiciona o objeto ao contexto com o estado Added.

    Para armazenar de fato as informaes de um objeto no banco de dados, utilizamos o mtodoSaveChanges() do DbContext. Todos os objetos do contexto que estejam no estado Added so inse-ridos no banco de dados quando o mtodo SaveChanges() chamado.

    1 Editora editora = new Editora { Nome = "K19", Email = "[email protected]" };23 // Adiciona a editora criada ao contexto com estado Added4 context.Editoras.Add(editora);56 // Sincroniza o contexto com o banco de dados7 context.SaveChanges ();

    Cdigo C# 3.44: Persistindo um objeto

    Buscando

    Para obter um objeto que contenha informaes do banco de dados, basta utilizar o mtodoFind() do DbSet. Devemos passar o identificador do objeto que desejamos recuperar como par-metro para esse mtodo.

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

    Cdigo C# 3.45: Buscando uma editora com o identificador 1

    Removendo

    Para indicar que determinado objeto deve ser removido, basta utilizar o mtodo System.Da-ta.Entity.DbSet.Remove(). Esse mtodo marca o objeto para ser removido do banco de dados,colocando-o no estado Deleted.

    Quando o mtodo SaveChanges() chamado, todas os objetos no estado Deleted so removidosdo banco de dados.

    1 Editora editora = context.Editoras.Find (1);23 // Marca a editora que deve ser removida4 context.Editoras.Remove(editora);56 // Sincroniza o contexto com o banco de dados7 context.SaveChanges ();

    56 www.k19.com.br

  • 57 ENTITY FRAMEWORK

    Cdigo C# 3.46: Removendo uma editora do banco de dados

    Atualizando

    Para alterar os dados do registro correspondente a um objeto, basta modificar as suas proprieda-des. Quando as propriedades de um objeto do contexto so alteradas, o estado Modified associadoa este objeto. Objetos no estado Modified so atualizados no banco de dados quando o mtodoSaveChanges() chamado.

    1 Editora editora = context.Editoras.Find (1);23 // Modificando as propriedades de um objeto4 editora.Nome = "Abril S/A";56 // Sincroniza o contexto com o banco de dados7 context.SaveChanges ();

    Cdigo C# 3.47: Alterando o nome de uma editora

    Listando

    Para obter uma listagem com todos os objetos referentes aos registros de uma tabela, podemosutilizar a Language Integrated Query (LINQ), que nos permite escrever consultas dentro do cdigoC#.

    1 var consulta = from e in context.Editoras2 where e.Nome.Contains("A")3 select e;45 // Equivalente a: SELECT * FROM Editoras e where e.Nome Like A%6 foreach (var item in consulta)7 {8 System.Console.WriteLine("Editora: " + item.Nome);9 }

    Cdigo C# 3.48: Utilizando LINQ para fazer uma consulta

    Exerccios de Fixao

    12 Adicione uma classe no projeto K19EntityFramework chamada InsereAluno.

    1 namespace K19EntityFramework2 {3 public class InsereAluno4 {5 static void Main(string [] args)6 {7 using (var ctx = new K19Context ())8 {9 Console.WriteLine("Digite o nome do aluno");10 string nome = Console.ReadLine ();1112 Console.WriteLine("Digite o logradouro do endereo do aluno");13 string logradouro = Console.ReadLine ();14

    www.facebook.com/k19treinamentos 57

  • ENTITY FRAMEWORK 58

    15 Console.WriteLine("Digite o nmero do endereo do aluno");16 int numero = Int32.Parse(Console.ReadLine ());1718 Console.WriteLine("Digite o CEP do endereo do aluno");19 string cep = Console.ReadLine ();2021 Aluno a = new Aluno22 {23 Nome = nome ,24 Endereco = new Endereco25 {26 Logradouro = logradouro ,27 Numero = numero ,28 CEP = cep29 }30 };3132 ctx.Alunos.Add(a);33 ctx.SaveChanges ();34 }3536 }37 }38 }

    Cdigo C# 3.49: InsereAluno.cs

    Nas propriedades do projeto K19EntityFramework, altere o statup object selecionando a classeInsereAluno. Depois execute o projeto.

    13 Adicione uma classe no projeto K19EntityFramework chamada ListaAluno.

    1 using System.Linq;2 namespace K19EntityFramework3 {4 public class ListaAluno5 {6 static void Main(string [] args)7 {8 using (var ctx = new K19Context ())9 {10 var consulta = from a in ctx.Alunos select a;1112 foreach (Aluno a in consulta)13 {14 Console.WriteLine("Nome: " + a.Nome);15 Console.WriteLine("Logradouro: " + a.Endereco.Logradouro);16 Console.WriteLine("Nmero: " + a.Endereco.Numero);17 Console.WriteLine("CEP: " + a.Endereco.CEP);18 Console.WriteLine("-----------------------------");19 }20 }21 }22 }23 }

    Cdigo C# 3.50: ListaAluno.cs

    Nas propriedades do projeto K19EntityFramework, altere o statup object selecionando a classeListaAluno. Depois execute o projeto.

    14 Adicione uma classe no projeto K19EntityFramework chamada AlteraAluno.

    58 www.k19.com.br

  • 59 ENTITY FRAMEWORK

    1 namespace K19EntityFramework2 {3 public class AlteraAluno4 {5 static void Main(string [] args)6 {7 using (var ctx = new K19Context ())8 {9 Aluno a = ctx.Alunos.Find (1);10 a.Nome = a.Nome + "ALTERADO";1112 ctx.SaveChanges ();13 }14 }15 }16 }

    Cdigo C# 3.51: AlteraAluno.cs

    Nas propriedades do projeto K19EntityFramework, altere o statup object selecionando a classeAlteraAluno. Depois execute o projeto.

    15 Adicione uma classe no projeto K19EntityFramework chamada RemoveAluno.

    1 namespace K19EntityFramework2 {3 public class RemoveAluno4 {5 static void Main(string [] args)6 {7 using (var ctx = new K19Context ())8 {9 Aluno a = ctx.Alunos.Find (1);1011 ctx.Alunos.Remove(a);1213 ctx.SaveChanges ();14 }15 }16 }17 }

    Cdigo C# 3.52: RemoveAluno.cs

    Nas propriedades do projeto K19EntityFramework, altere o statup object selecionando a classeRemoveAluno. Depois execute o projeto.

    Repositrios

    As classes DbContext e DbSet do Entity Framework oferecem recursos suficientes para que osobjetos do domnio sejam persistidos, recuperados, alterados e removidos do banco de dados. Po-rm, em aplicaes com alta complexidade e grande quantidade de cdigo, espalhar as chamadasaos mtodos do DbContext e DbSet pode gerar dificuldades na manuteno e no entendimento dosistema.

    Para melhorar a organizao das nossas aplicaes, diminuindo o custo de manuteno e au-mentando a legibilidade do cdigo, podemos aplicar o padro Repository do DDD (Domain Driven

    www.facebook.com/k19treinamentos 59

  • ENTITY FRAMEWORK 60

    Design).

    Conceitualmente, um repositrio representa o conjunto de todos os objetos de um determinadotipo. Ele deve oferecer mtodos para administrar seus elementos.

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

    1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Data.Entity;56 namespace K197 {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 }34 }35 }

    Cdigo C# 3.53: EditoraRepository.cs

    1 var context = new K19Context ();23 EditoraRepository repository = new EditoraRepository(context);45 List editoras = repository.BuscaTodas ();

    Cdigo C# 3.54: Buscando todas as editoras armazenadas no banco de dados

    60 www.k19.com.br

  • CODE FIRST MIGRATIONS

    CA

    P

    TU

    LO

    4Code First Migrations

    O Entity Framework Code First da Microsoft tem uma funcionalidade que permite controlar asmudanas no banco de dados que sero realizadas de acordo com as alteraes na camada de mo-delo da aplicao. Essa funcionalidade chamada de Code First Migrations.

    O Code First Migrations foi adicionado na verso 4.3.1 do Entity Framework. Neste captulo uti-lizaremos o Entity Framework 5.0.

    Passo a Passo

    Para testar o funcionamento do Code First Migrations, criaremos um projeto no Visual Studio.

    Agora, devemos instalar o Entity Framework 5.0. Para isso, utilizaremos o gerenciador de pacotesNuget do Visual Studio.

    www.facebook.com/k19treinamentos 61

  • CODE FIRST MIGRATIONS 62

    O Nuget permite que bibliotecas e ferramentas sejam instaladas no Visual Studio. Ao instalarpacotes no seu projeto, ele adiciona as bibliotecas, referncias e faz as alteraes necessrias nos ar-quivos de configurao. Mais informaes sobre o Nuget e os pacotes disponveis, acesse o endereohttp://nuget.org/packages

    Para instalar o Entity Framework 5.0, basta selecionar o pacote Entity Framework e clicar emInstall.

    62 www.k19.com.br

    http://nuget.org/packages
  • 63 CODE FIRST MIGRATIONS

    Aps a instalao do Entity Framework 5.0, adicionaremos uma classe de modelo chamada Editora.Essa entidade ser mapeada atravs de uma classe chamada K19Context. Para testar, criaremos umaclasse com o mtodo Main(). Observe o cdigo dessas trs classes.

    1 namespace EFMigrations2 {3 public class Editora4 {5 public int Id { get; set; }6 public string Nome { get; set; }7 public string Email { get; set; }8 }9 }

    Cdigo C# 4.1: Editora.cs

    1 namespace EFMigrations2 {3 public class K19Context : DbContext4 {5 public DbSet Editoras { get; set; }6 }7 }

    Cdigo C# 4.2: K19Context.cs

    1 namespace EFMigrations2 {3 class Program4 {5 static void Main(string [] args)6 {7 using (var context = new K19Context ())

    www.facebook.com/k19treinamentos 63

  • CODE FIRST MIGRATIONS 64

    8 {9 Editora e = new Editora { Nome = "K19",10 Email = "[email protected]" };11 context.Editoras.Add(e);12 context.SaveChanges ();13 }14 }15 }16 }

    Cdigo C# 4.3: Program.cs

    Aps a execuo do projeto, teremos a seguinte tabela e banco de dados.

    O prximo passo alterar a classe de modelo Editora.

    1 namespace EFMigrations2 {3 public class Editora4 {5 public int Id { get; set; }6 public string Nome { get; set; }7 public string Email { get; set; }89 public string Telefone { get; set; }10 }11 }

    Cdigo C# 4.4: Editora.cs

    Com a alterao na classe Editora, um exeo gerada ao executar o projeto.

    64 www.k19.com.br

  • 65 CODE FIRST MIGRATIONS

    Para resolver esse problema, o banco de dados precisa ser atualizado. Para fazer essa atualizao,o Entity Framework recomenda a utilizao da ferramenta Code First Migrations.

    O primeiro passo para utilizar Code First Migrations habilit-lo e adicion-lo ao projeto atravsdo Package Manager Console.

    O comando Enable-Migrations adiciona uma pasta chamada Migrations no projeto. Esta pastacontm dois arquivos.

    A classe Configuration permite definir o comportamento do Code First Migrations para onosso contexto.

    A classe parcial InitialCreate define a primeira verso das tabelas do banco de dados.

    O Code First Migration tem dois comandos fundamentais.

    www.facebook.com/k19treinamentos 65

  • CODE FIRST MIGRATIONS 66

    Add-Migration que gera o cdigo necessrio para atualizar o banco de dados de acordo comas alteraes nas classes de modelo.

    Update-Database aplica as alteraes pendentes no banco de dados.

    Aps adicionarmos a propriedade Telefone classe Editora, devemos adicionar uma Migrationao projeto para atualizar o banco de dados e adicionar uma nova coluna tabela Editoras. Paraadicionar uma Migration, devemos utilizar o comando Add-Migration. Para atualizar o banco dedados com as alteraes definidas na Migration, devemos utilizar o comando Update-Database.

    Para utilizar o comando Add-Migration necessrio definir o nome da Migration a ser adicio-nada.

    O nome da Migration que adicionaremos ser AddTelefoneToEditora.

    A classe que define a migrao adicionada pasta Migrations.

    66 www.k19.com.br

  • 67 CODE FIRST MIGRATIONS

    Para atualizar o banco de dados com as alteraes definidas na Migration, devemos executar ocomando Update-Database.

    Uma nova coluna adicionada tabela Editoras no banco de dados.

    Exerccios de Fixao

    1 Crie um projeto do tipo Console Application chamado CodeFirstMigrations no Visual Studio2012 Express for Desktop.

    2 Adicione o Entity Framework ao projeto CodeFirstMigrations atravs do Manage Nuget Packages.

    www.facebook.com/k19treinamentos 67

  • CODE FIRST MIGRATIONS 68

    3 Aps adicionar o Entity Framework ao projeto, crie a classe Editora.

    1 using System.ComponentModel.DataAnnotations;23 namespace CodeFirstMigrations4 {5 class Editora6 {7 public int Id { get; set; }8 [Required(ErrorMessage = "O campo nome obrigatrio")]9 public string Nome { get; set; }10 [Required(ErrorMessage = "O campo email obrigatrio")]11 public string Email { get; set; }12 }13 }

    Cdigo C# 4.5: Editora.cs

    4 Crie uma classe K19Context e adicione a propriedade DbSet para mapear a entidade Editora.

    1 using System.Data.Entity;23 namespace CodeFirstMigrations4 {5 class K19Context : DbContext6 {7 public DbSet Editoras { get; set; }8 }9 }

    Cdigo C# 4.6: K19Context.cs

    5 Crie uma classe Program de teste para cadastrar as editoras.

    1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;67 namespace CodeFirstMigrations8 {9 class Program10 {11 static void Main(string [] args)12 {13 using (var context = new K19Context ())14 {15 Console.WriteLine("Digite o nome da Editora:");16 string nome = Console.ReadLine ();17 Console.WriteLine("Digite o email da Editora:");18 string email = Console.ReadLine ();19 Editora e = new Editora { Nome = nome , Email = email };20 context.Editoras.Add(e);21 context.SaveChanges ();22 }232425 }26 }27 }

    Cdigo C# 4.7: Program.cs

    68 www.k19.com.br

  • 69 CODE FIRST MIGRATIONS

    Execute o projeto e cadastre uma editora.

    6 Altere a classe Editora adicionando a propriedade Telefone.

    1 using System.ComponentModel.DataAnnotations;23 namespace CodeFirstMigrations4 {5 public class Editora6 {7 public int Id { get; set; }8 [Required(ErrorMessage = "O campo nome obrigatrio")]9 public string Nome { get; set; }10 [Required(ErrorMessage = "O campo email obrigatrio")]11 public string Email { get; set; }12 public string Telefone { get; set; }13 }14 }

    Cdigo C# 4.8: Editora.cs

    7 Execute novamente o projeto. Verifique que uma exceo do tipo System.InvalidOperationExceptionocorrer.

    8 Para corrigir o problema visto no exerccio anterior, devemos habilitar o Code First Migrations.Para isso, execute o seguinte comando atravs do Package Manager Console.

    Enable-Migrations.

    www.facebook.com/k19treinamentos 69

  • CODE FIRST MIGRATIONS 70

    Verifique que uma pasta chamada Migrations com dois arquivos: _InitialCreate.cs e Con-figuration.cs foi gerada no projeto CodeFirstMigrations.

    9 Aps habilitar o Code First Migrations no projeto CodeFirstMigrations, devemos adicionaruma migrao para atualizar o banco de dados adicionando a coluna Telefone na tabela Editoras.Crie uma migrao chamada AddTelefoneToEditora atravs do comando Add-Migration. Executeeste comando atravs do Package Manager Console.

    Verifique que um arquivo de migrao foi criado na pasta Migrations:

    1 namespace CodeFirstMigrations.Migrations2 {3 using System;4 using System.Data.Entity.Migrations;56 public partial class AddTelefoneToEditora : DbMigration

    70 www.k19.com.br

  • 71 CODE FIRST MIGRATIONS

    7 {8 public override void Up()9 {10 AddColumn("dbo.Editoras", "Telefone", c => c.String ());11 }1213 public override void Down()14 {15 DropColumn("dbo.Editoras", "Telefone");16 }17 }18 }

    Cdigo C# 4.9: _AddTelefoneToEditora.cs

    10 Para atualizar a tabela Editoras no banco de dados, utilize o comando Update-Database que executado atravs do Package Manager Console.

    Verifique que a coluna Telefone foi adicionada a tabela Editoras.

    Acrescentando uma nova entidade

    O Code First Migrations gerencia as alteraes no modelo e a adio de novas entidades. Aoadicionar uma nova entidade ao projeto, devemos criar uma Migration que adicionar uma novatabela para o qual a classe ser mapeada. Considere a seguinte classe para definir a entidade Livro.

    1 namespace EFMigrations2 {3 public class Livro4 {5 public int Id { get; set; }6 public string Titulo { get; set; }7 public decimal Preco { get; set; }8 public int EditoraId { get; set; }9 public Editora Editora { get; set; }10 }11 }

    Cdigo C# 4.10: Livro.cs

    Para estabelecer o relacionamento entre as entidades Editora e Livro, a classe Editora deverser alterada.

    1 namespace EFMigrations2 {

    www.facebook.com/k19treinamentos 71

  • CODE FIRST MIGRATIONS 72

    3 public class Editora4 {5 public int Id { get; set; }6 public string Nome { get; set; }7 public string Email { get; set; }8 public string Telefone { get; set; }910 [ForeignKey("EditoraId")]11 public virtual IList Livros { get; set; }12 }13 }

    Cdigo C# 4.