microsoft students to business - filipomor.comfilipomor.com/pucrs/[pucrs]_s2b_webforms_fase3.pdf ·...
TRANSCRIPT
MicrosoftStudents to Business
Desenvolvimento de Software – 3ª Fase
Desenvolvendo para internet
parte V
Acesso a Dados
NET oferece alternativas de acesso aos dados de um banco de dados relacional:
Biblioteca de classes ADO.NET
Uma API de acesso e manipulação de “baixo nível”
TableAdapters e DataSet Tipado
Camada de acesso a dados fornecida por geradores de código do Visual Studio baseado no ADO.NET
Entity Framework
Framework para mapeamento objeto/relacional
LINQ
Linguagem embutida de acesso e manipulação de alto nível
Acesso a Dados
Arquitetura em camadas
OO x Relacional
Questões do modelo Relacional
Trabalha-se no modelo dos dados
Forte acoplamento com os elementos do modelo ER: tabelas, chaves (primária e estrangeira)
Objetos apenas para “uso em memória”
Como tratar a questão das chaves primárias?
Como tratar a questão das chaves estrangeiras?
OO x Relacional
Exemplo: modelo relacional
Editora
PK codigo
nome
Livro
PK codigo
titulo
ano
FK1 codEditora
Autor
PK codigo
primeiroNome
ultimoNome
LivroAutor
PK,FK1 codLivro
PK,FK2 codAutor
OO x Relacional
Questões do modelo OO
Trabalha-se em um modelo que agrega dados e operações
Como representar as associações entre objetos?
Como mapear hierarquias de herança?
Qual o ciclo de vida de um objeto persistente?
Exemplo: diagrama de classes
codigo
nome
Editora
codigo
titulo
ano
Livro
codigo
primeiroNome
ultimoNome
Autor
0..*1..1 0..*0..*
Exemplo: diagrama de classes
Editora
PK codigo
nome
Livro
PK codigo
titulo
ano
FK1 codEditora
Autor
PK codigo
primeiroNome
ultimoNome
LivroAutor
PK,FK1 codLivro
PK,FK2 codAutor
codigo
nome
Editora
codigo
titulo
ano
Livro
codigo
primeiroNome
ultimoNome
Autor
0..*1..1 0..*0..*
OO x Relacional
Editora
PK codigo
nome
Livro
PK codigo
titulo
ano
FK1 codEditora
Autor
PK codigo
primeiroNome
ultimoNome
LivroAutor
PK,FK1 codLivro
PK,FK2 codAutor
codigo
nome
Editora
codigo
titulo
ano
Livro
codigo
primeiroNome
ultimoNome
Autor
0..*1..1 0..*0..*
Mapeamento Objeto-Relacional
Mapeamento Objeto Relacional (O/RM)
Técnica que mapeia os conceitos de Objetos para Relacional e vice-versa
Vantagens:
Produtividade
Trabalha-se sempre no mesmo paradigma (OO)
Manutenção
Baixo acoplamento com o modelo de dados
Desempenho???
Porque não fazer tudo
em assembler?
Mapeamento Objeto-Relacional
Idéia geral:
Classes
Objetos
EstadoComportamento
Tabelas e RelacionamentosRegistros
ColunasDML e SQL
Entity Framework
Entity Framework é um O/RM que separa o modelo conceitual do físico
Permite a programação OO, incluindo herança e “consulta sobre objetos”
Permite a mudança do modelo físico sem alteração da lógica de negócio
Modelo de memória simples, baseado em Concorrência Otimista com armazenamento em memória
(isto é, sem conexão aberta)
Aderente ao System.Transaction
Feito para suportar múltiplos bancos de dados relacionais
Mapeia Tabelas, Views e Stored Procedures
Entity Framework - Componentes
Entity Data Model (EDM)
Descreve o modelo conceitual (Objetos!)
Entity Data Provider
Um provedor para o EDM
Entity SQL
Uma versão estendida do SQL para o EDM
Object Services
Adiciona rastreamento de mudanças, identidade de objetos, attach / detach
LINQ to Entities
Uma implementação do LINQ sobre o EDM
Entity Framework - Arquitetura
Entity Client – EDM, Entity SQL
Entity
Framework
Runtime
Data Providers (ADO.NET patterns)
SQL
Server
Relational
DBMS
Web Service
Modeling
Mappin
g
Bro
wsi
ng
Bin
din
g
Programming Layers
Code G
en Reporting
Sync
Analysis
Search
Entity Services
Mapping
Query and
Update
Pipelines
Transactions
Metadata
Services
Linq to EntitiesEntity SQL
Applications
SqlClie
ntOtherClien
t
Non-
relational
Entity Framework - Abordagens
NewDatabase
ExistingDatabase
Centrada no Projeto Centrada no código
Database FirstReverse engineer model in EF Designer
Classes auto-generated from model
Model FirstCreate model in EF Designer
Generate BD from model
Classes auto-generated from model
Code FirstDefine classes and mapping in code
EF Power Tools provide reverse engineer
Code FirstDefine classes and mapping in code
Database created from code
Migrations apply model changes to database
Fonte: https://msdn.microsoft.com/en-us/data/jj590134
Entity Data Model
Conceptual
Mapping
Storage
Entity Data Model
EDM é um conjunto de modelos (especificado em arquivo XML .edmx)
que define o mapeamento objeto-relacional
Três modelos:
Conceitual (CSDL - Conceptual Schema Definition Language)
Mapeamento (MSL - Mapping Specification Language)
Armazenamento (SSDL - Storage Schema Definition Language)
EDM – Conceitos Principais
Conceptual
Mapping
Storage
Entity Data Model
Entidade (entity):
Representa um objeto do domínio da aplicação
Possui um nome único
Possui uma chave de entidade
Possui dados na forma de propriedades
Possui propriedades de navegação (associação entre entidades)
Possui chaves estrangeiras (associação entre entidades)
Conjunto de entidades (entity set):
Representa um contêiner lógico para entidades de um mesmo tipo
(inclui tipos derivados)
EDM – Conceitos Principais
Exemplo: CourseManager - Tabelas
EDM – Conceitos Principais
Exemplo: CourseManager - Entidades
EDM – Conceitos Principais
Propriedade (property):
Define a estrutura e características dos dados de uma entidade
Pode conter dados primitivos ou estuturados (definidos em tipos complexos)
Possui facetas (facets) que definem restrições e comportamentos adicionais (valor padrão, se aceita null,
tamanho máximo, etc)
Propriedade de navegação (navigation property):
Propriedade que permite a navegação entre entidades associadas
Pode ser apenas unidirecional
EDM – Conceitos Principais
Propriedade (property):
Define a estrutura e características dos dados de uma entidade
Pode conter dados primitivos ou estuturados (definidos em tipos complexos)
Possui facetas (facets) que definem restrições e comportamentos adicionais (valor padrão, se aceita null,
tamanho máximo, etc)
Propriedade de navegação (navigation property):
Propriedade que permite a navegação entre entidades associadas
Pode ser apenas unidirecional
EDM – Conceitos Principais
Chave de entidade (entity key):
Propriedade(s) utilizada para identificar uma entidade única
É de um tipo primitivo, não anulável e imutável
Chave estrangeira (foreing key):
Propriedade que implementa um relacionamento entre entidades
EDM – Conceitos Principais
Associação (association):
Representa o relacionamento binário entre entidades (inclusive autorelacionamento)
Cada associação possui duas terminações, anotadas com multiplicidades
Um : 1, Zero ou um : 0..1, Muitos : *
Uma associação pode possui restrições de integridade referenciais
Entidades associadas são acessadas via propriedades de navegação ou chaves estrangeiras
Conjunto de associações (association set):
Representa um contêiner lógico para associações de um mesmo tipo
LINQ to Entities
Consultas - busca
var companyNameQuery =
from cust in nw.Customers
where cust.City == "London"
select cust.CompanyName;
foreach(var customer in companyNameQuery) {…}
Consultas
Quando um consulta é executada, algumas expressões são avaliadas no servidor e outras no cliente
Nem todos operadores padrão do LINQ são suportados pelo LINQ to Entities!
Veja http://msdn.microsoft.com/en-us/library/bb738550.aspx
Consultas
Propriedades de navegação em relacionamentos 1-1, 1-N ou N-N
Necessário carregar dados relacionados:
Propriedade LazyLoadingEnabled
Indica se objetos relacionados serão carregados automaticamente via propriedade de navegação
Dispara uma nova consulta para cada navegação
Método Load
Carregamento explícito quando necessário
Dispara uma nova consulta para cada load
Método Include
Carregamento imediato
Dispara uma consulta única
Consulta gerada é mais complexa
Consultas
A consulta abaixo não irá funcionar:
var contato = (from contact in awe.Contact
where contact.LastName == "Zhou"
select contact).First();
foreach (var pedido in contato.SalesOrderHeader)
{
Console.WriteLine(pedido.SalesOrderID);
}
Coleção está vazia!
Consultas
Include
Recebe como parâmetro um query path que especifica as entidades relacionadas que devem ser
carregadas com os dados
Uma única requisição é realizada ao BD
var customer = (from contact in awe.Contact
.Include("SalesOrderHeader.SalesOrderDetail")
where contact.LastName == "Zhou"
select contact).First();
Consultas
Load
Permite carregar explicitamente as entidades relacionadas
Várias requisições são realizadas ao BD
Se chamado dentro de um laço foreach, o EDM deve estar configurado com
MultipleActiveResultSets=True na string de conexão
Contact customer = (from contact in awe.Contact
where contact.LastName == "Zhou"
select contact).First();
if (!customer.SalesOrderHeader.IsLoaded) {
customer.SalesOrderHeader.Load();
}
Inserção
Criar um novo objeto
Construtor ou método estático CreateXXX()
Adicionar novos objetos sobre o modelo via métodos Add(), AddObject(), AddToXXX()
Executar método SaveChanges()
Customer cust = new Customer();
cust.CompanyName = "SomeCompany";
cust.City = "London";
cust.CustomerID = "98128";
cust.PostalCode = "55555";
cust.Phone = "555-555-5555";
contexto.AddToCustomers(cust);
contexto.SaveChanges();
Inserção
Criar um novo objeto
Construtor ou método estático CreateXXX()
Adicionar novos objetos sobre o modelo via métodos Add(), AddObject(), AddToXXX()
Executar método SaveChanges()
Customer cust = Customer.CreateCustomer("SomeCompany",
"London","98128","55555","555-555-5555");
contexto.AddToCustomers(cust);
contexto.SaveChanges();
Inserção
Para inserir em um relacionamento:
1-N ou N-N utilizar Add() na coleção referenciada EntityCollection
1-1 utilizar propriedade Value na entidade referenciada EntityReference
SalesOrderDetail sod = SalesOrderDetail.CreateSalesOrderDetail(…);
order.SalesOrderDetail.Add(sod);
contexto.SaveChanges();
Alteração
Obter um objeto do modelo
Garantir que o objeto esteja sob controle do contexto
Alterar o objeto
Estado do objeto muda de Unchanged para Modified
Executar método SaveChanges()
var cust =
(from c in contexto.Customers
where c.CustomerID == "ALFKI"
select c).First();
cust.ContactName = "New Contact";
contexto.SaveChanges();
Remoção
Obter um objeto do modelo
Executar método DeleteObject()
Marca objeto para remoção
Executar método SaveChanges()
Relacionamentos também são removidos
var deleteIndivCust =
from cust in contexto.Customers
where cust.CustomerID == "98128"
select cust;
if (deleteIndivCust.Count() > 0){
contexto.Customers.Remove (deleteIndivCust.First());
contexto.SaveChanges();
}
Remoção
Cuidado!
Regras de remoção em cascata de entidade relacionadas devem ser especificadas tanto no modelo
conceitual quanto na base de dados
Entity Framework somente remove entidades relacionadas se elas estiverem em memória e sob gerência
do contexto
Laboratório 19
Uso do Entity Framework em uma abordagem Code First (código primeiro)
Definir classes de “Modelo”, incluir propriedades para chaves e navegação
Conexão ao banco de dados
Uso de um contexto EF
Uso de uma classe de inicialização
Definição de consultas utilizando LINQ to Entities
Abordagem Code First
Conexão ao banco de dados
Lab - Code first
<add name="ContatosDB"connectionString="Data
Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Contatos.mdf;Integrated Security=True"
providerName="System.Data.SqlClient" />
Uso de um contexto EF
Lab - Code first
public class ContatosDB : DbContext{
public DbSet<Contato> Contatos { get; set; }}
EF Context
(Repository pattern)
Tabela do BD
(operações de CRUD)
classe de inicialização
Lab - Code first
public class ContatosInicializer : DropCreateDatabaseIfModelChanges<ContatosDB>{
protected override void Seed(ContatosDB context){
base.Seed(context);var contatos = new List<Contato> {
new Contato { Nome="Huginho", Telefone="12345678", HorarioComercial=true },
new Contato { ... };contatos.ForEach(c => context.Contatos.Add(c));context.SaveChanges();
}}
// Global.asax Application_Start()
Database.SetInitializer<ContatosDB>(new ContatosInicializer());
Laboratório 20
Ferramenta LINQPad
http://linqpad.net/
LINQ
http://msdn.microsoft.com/en-us/library/bb397926.aspx
PLINQ
http://msdn.microsoft.com/en-us/library/dd460688.aspx
ADO.NET Entity Framework
http://msdn.microsoft.com/en-us/library/bb399572.aspx
Aonde Ir?
MSDN
http://msdn.microsoft.com
Data Developer Center
http://msdn.microsoft.com/data
Aonde Ir?
Segurança
Autenticação e Autorização
Autenticação refere-se ao processo de obtenção da credencial do usuário e verificação de sua validade
Autorização refere-se ao processo de liberação de acesso a determinados recursos protegidos
Segurança
Arquitetura
Os clientes se comunicam com o ASP.NET através do IIS
Internet Information Services
O ASP.NET fornece recursos de segurança implementados
pelo .NET Framework
Segurança no IIS
Autenticação no IIS é uma camada prévia à autenticação no ASP.NET!
Mecanismos de autenticação do IIS:
Anonymous
Solicitações são automaticamente autenticadas
Basic
Credenciais são transmitidas de forma textual simples pela rede
Digest
Credenciais são transformadas via hash para serem transmitidas
Integrated Windows
Credenciais são transformadas de modo semelhante ao login do Windows em um Active Directory
Segurança no IIS
Segurança no ASP.NET
Segurança no ASP.NET
Recursos para trabalhar com Autenticação e Autorização
Controles específicos
API ASP.NET Identity
Autenticação no ASP.NET
Ao criar um novo projeto no Visual Studio deve ser selecionado o mecanismo de autenticação que será
configurado
Autenticação no ASP.NET
Opções de configuração do projeto:
No Authentication: usuários anônimos
Individual User Accounts: ASP.NET Identity (http://www.asp.net/identity)
Organizational Accounts: Windows Identity Foundation para usuários com contas no Azure Active
Directory ou Windows Server Active Directory
Windows Authentication: modulo Windows Authentication do IIS
Autenticação no ASP.NET
Autenticação no ASP.NET
É um subsistema que implementa diferentes mecanismos de autenticação
Características:
Oferece gerência de usuários, perfis (“profiles”) e grupos (“roles”)
Extensível
Suporte a Microsoft Account, Google, Facebook, Twitter, etc
Suporte a programação assíncrona
Baseado no OWIN - Open Web Interface for .NET (http://owin.org/)
Diferentes modelos de armazenamento de dados
Projeto padrão utiliza o SQL LocalDB com Entity Framework Code First
Distribuição de atualizações via NuGet
Autenticação no ASP.NET
Versões:
1.0 – VS 2013 RTM
2.0 – VS 2013 Update 2
2.1 – VS 2013 Update 3
ASP.NET Identity
Estrutura do Template de Projeto padrão no Visual Studio:
Configuração:
Arquivo Startup.cs: ponto de partida para a configuração do ASP.NET Identity
Arquivo App_Start/Startup.Auth.cs: classe parcial (arquivo Startup.cs) com método de configuração do
ASP.NET Identity
Arquivo App_Start/IdentityConfig.cs: classes para configuração das opções dos elementos de
autenticação
ASP.NET Identity
Estrutura do Template de Projeto padrão no Visual Studio:
Dados:
Arquivo Models/IdentityModels.cs:
Classe ApplicationUser define as informações disponíveis sobre o usuário; representa propriedades que
serão armazenadas no banco de dados do ASP.NET Identity
Classe ApplicationDbContext representa o a base de dados do Entity Framework
Classe IdentityHelper possui métodos de utilidade geral
ASP.NET Identity
Objetos básicos:
ASP.NET Identity
Objetos básicos:
Autorização
Configuração via arquivo Web.config
Marcação <authorization> dentro de <system.web>
com base na identificação de usuário
<allow users="..."> para permitir acesso
<deny users="..."> para negar acesso
com base nos grupos de usuários
<allow roles="..."> para permitir acesso
<deny roles="..."> para negar acesso
Opções
Nome do usuário/roles no domínio
“*” para todos os usuários
“?” para usuários anônimos
Autorização
Exemplo:
<authorization>
<allow users="CI"/>
<deny users="?"/>
</authorization>
Componentes de Autenticação
Exemplo:
Controle Descrição
CreateUserWizard Coletar dados do usuário e criar uma nova conta
Login Controle composto para página de login
LoginStatus Fornece link de loginf ou logout em função do status do usuário
LoginView Permite filtragem de conteúdo em função do status do usuário (se
autenticado ou anônimo)
PasswordRecovery Controle composto para página de recuperação de senhas perdidas
ChangePassword Controle composto para página de alteração de senha
Laboratório 21