Introdução ao Entity Framework 4
Everton Coimbra de Araújo
[email protected]
http://pptinformatica.com.br/wordpress
http://twitter.com/evertonfoz
Fábio Augusto Pandolfo
[email protected]
http://dotando.blogspot.com
http://twitter.com/fabiopand
Objetivos
• Contextualizar alguns conceitos relacionados à
persistência de dados, bem como algumas
disparidades encontradas entre os modelos
relacional e orientado à objetos.
• Introduzir a utilização do ADO .NET Entity
Framework, tecnologia que vem rápidamente
ganhando muita popularidade como camada
de persistência.
Agenda
• Visão geral sobre persistência
– Diferenças de Impedância
– Mapeamento Objeto/Relacional
• Entity Framework
–
–
–
–
Database-First
Model-First
Code-First
N-Tier
• Opções de consulta
– Entity Client
– Entity SQL
– LINQ To Entities
Orientação a objetos
• Herança
• Polimorfismo
• Encapsulamento
Persistência
• Para que serve?
• Quais as práticas mais utilizadas?
Modelo Relacional
•
•
•
•
Armazenamento
Manutenção
Integridade
Transações
Dificuldades impostas
• Cada propriedade de um objeto a ser
persistida precisa ser mapeada para seu
respectivo campo na tabela.
• O desenvolvedor precisa conhecer banco de
dados e orientação a objetos.
• Muito trabalho de codificação.
Diferença de Paradigmas (Impedância)
•
•
•
•
•
Granularidade
Herança e polimorfismo
Identidade
Associações
Navegação
Diferença de Paradigmas (Impedância)
• O exemplo abaixo não apresenta problemas
de descasamento de paradigma
Diferença de Paradigmas (Impedância)
• Disparidade entre o objeto-relacional não
aparece
public class Revistas {
private long id;
private String nome;
private List<Artigo> artigos;
//(get/set), etc...
}
public class Artigo {
private long id;
private String titulo;
private Revista revista;
//get/set, etc...
}
create table REVISTAS (
ID BIGINT NOT NULL PRIMARY KEY,
NOME NVARCHAR(50) NOT NULL
)
create table ARTIGOS (
ID BIGINT NOT NULL PRIMARY Key,
TITULO NVARCHAR(50) NOT NULL,
REVISTAS_ID BIGINT
FOREIGN KEY REFERENCES REVISTAS
)
Problema de granularidade
• Imagine uma tabela de autores
Problema de granularidade
• E se o usuário tiver um endereço
– Deve ser uma nova tabela? Deve aparecer como
colunas extras na tabela do usuário?
• Problema
– Objetos podem ter vários níveis de granularidade
– Tabelas (colunas) impõem limites
Problema de granularidade
• Solução usual
– é colocar tudo na tabela USER
• Problema fácil de solucionar
create table AUTORES(
ID BIGINT NOT NULL PRIMARY KEY,
NOME NVARCHAR(50) NOT NULL,
SOBRENOME NVARCHAR(50)
RUA NVARCHAR(50),
BAIRRO NVARCHAR(50),
NUMERO NVARCHAR(50),
CEP NVARCHAR(50),
)
AUTOR
ENDEREÇO
Problemas com Herança e
Polimorfismo
• O modelo relacional não suporta
• Queremos escrever consultas que referem-se
à classe Cliente e retornar instâncias
concretas dessa classe!
Problema de identidade
• No modelo relacional, existe um critério de igualdade:
– Chave-primária
• No mundo Orientado a Ojetos há dois
– Igualdade de referência (no C# testado com ==)
– Equivalência (no C# testado com equals())
• Além disso, mapeamento pode associar vários objetos
a uma mesma tabela!
• Complicações adicionais
– Chaves naturais
– Chaves compostas
Problema de associações
• A orientação a objetos representa associações
como referências (ou coleções de) referências
para objetos
– São direcionais
– Para implementar associações bidirecionais, é preciso criar referências
dos dois lados da associação
– Referências dos dois lados podem ser associações muitos-para-muitos
• No mundo relacional, associações
representadas por chaves estrangeiras
– Não são direcionais
– Pode-se criar associações com projeções e joins
– Associações muitos-para-muitos requerem tabela extra
são
Problema de navegação
• Navegação em objetos
– Pula-se de um objeto para outro sem a definição de um
caminho previamente definido
– Equivalente a fazer um consulta a cada navegação
– A forma mais natural de navegar entre objetos é a forma menos
eficiente de recuperar dados em SQL
• Soluçao: joins para minimizar as consultas
• Porém, é preciso traçar o caminho de navegação antes!
Table-per-Hierarchy (TPH)
• One table in storage to maintain data for
all the types in an inheritance hierarchy.
Table-per-Type (TPT)
• Separate table in storage to maintain
data for each type in the inheritance
hierarchy.
Como implementar essa estrutura?
Como minimizar a impedância?
• Com a criação de uma camada de persistência
para resolver os problemas de comunicação
com a base de dados.
• Devo criar a camada ou utilizar uma pronta?
Mapeamento Objeto/Relacional
• Propõe soluções para minimizar a disparidade
existente entre a orientação a objetos e o
modelo relacional.
Dilema
Os desenvolvedores preferem
trabalhar com:
• Modelos conceituais
• Objetos de negócio
• Classes
Bancos de dados foram
projetados para:
• Manutebilidade
• Segurança
• Eficiência
• Escalabilidade
Tecnologias de acesso à dados
Acesso à dados em 1990
• ODBC, embedded SQL
Acesso à dados em 2000
• ADO, Stored Procedures
Acesso à dados em 2005
• ADO.NET, Datasets, DataReaders
Acesso à dados em 2010
• Entity Framework 4
Tecnologias de acesso à dados
• Entity Framework (EFv1)
– Introduzido no .NET Framework 3.5 SP1
– Juntamente com o Visual Studio 2008 SP1
– Lançado no em agosto de 2008
• Entity Framework 4 (EFv4)
– Parte integrante do .NET 4
– Lançado em abril de 2010
Limitações do EFv1
•
•
•
•
•
Ausência de Lazy Loading
Sem suporte a Persistence Ignorance
Dificuldades para desenvolvimento N-Tier
Alguns bugs
Entre outras
Fontes de inspiração do EFv4
• Eric Evans, autor de Domain-Driven-Design: Tackling
Complexity in the Heart of Software;
• Stephen Forte, diretor de estratégia na Telerik e diretor
regional da Microsoft;
• Martin Fowler, autor de Patterns of Enterprise Application
Software e muitos outros livros, e criador do termo
Persistence Ignorance;
• Pavel Hruby, autor de Model-Driven Design Using Business
Patterns and the Visio Stencil for UML and SysML;
• Jimmy Nilsson, autor de Applying Domain-Driven Design
and Patterns with Examples in C# and .NET e criador das
regras para Persistence Ignorance;
O que é o Entity
Framework?
• Uma evolução do pacote de
tecnologias ADO.NET
• Uma camada de abstração
dos bancos de dados
• Separa o modelo físico do
conceitual
• Portabilidade para os mais
variados bancos de dados
Imagem: http://msdn.microsoft.com/en-us/data/aa937709.aspx
Arquitetura do Entity Framework
Imagem: http://www.manning.com/mostarda/
Oque é uma Entidade?
• Capacidade independente de existência
• Identificada únicamente.
Entity-Relationship Model (ERM)
• Nos anos 70 o Dr. Peter Chen
inventou o ERM
– Conceptual Layer
– Mapping Layer
– Storage Layer
• Implementado no Entity Framework
(Entity Data Model)
Entity Data Model (EDM)
• Mapeamento e
Modelagem
– Entidades
– Relacionamentos
– Conjuntos lógicos
CSDL
MSL
SSDL
Arquitetura do Entity Data Model
Imagem: http://oreilly.com/catalog/9780596520298
Database-First
• Partindo do Banco de Dados
• Porque?
– Já existe!
• Oque?
– Cria o modelo a partir dele!
Database-First
Object Services
• Consultas materializadas como objetos
– ObjectContext
– ObjectQuery<T>
• Opções de consulta(prós e contras)
– Entity SQL (ESQL)
– Entity Client
– LINQ to Entities
EntityClient
•
•
Streams data back to the application
Resembles SqlClient, OracleClient and the other client providers
•
•
•
•
•
•
•
•
•
•
•
•
•
•
using (var conn = new EntityConnection("name=ProgrammingEFDB1Entities"))
{
conn.Open();
var qStr = "SELECT VALUE c FROM SchoolEntities.Courses AS c ";
var cmd = conn.CreateCommand();
cmd.CommandText = qStr;
using (var rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
while (rdr.Read())
{
Console.WriteLine(rdr.GetString(1));
}
}
}
EntityClient
Entity SQL (ESQL)
• T-SQL-like query language
• Provide the necessary capabilities for querying the
EDM
• EF translates Entity SQL into storage-specific queries
• var qStr = @"SELECT VALUE c
•
FROM SchoolEntities.Courses AS c
•
WHERE c.Title=‘Calculus'";
• var courses = context.CreateQuery<Course>(qStr);
Entity SQL (ESQL)
LINQ to Entities
• Support for LINQ features
• Full IntelliSense support
• var courses = from course in context.Courses
•
where course.Title.StartsWith("C")
•
orderby course.Title ascending
•
select new
•
}
•
Title = course.Title,
•
Location = course.Location
•
};
LINQ to Entities
Model-First
• Partindo do modelo
• Porque?
– Separação entre código e banco de dados!
• Oque?
– Cria o banco a partir dele!
Model-First
Carga
• Eager Loading
• Explicit Loading
• Lazy Loading
Carga
Estratégias de herança
• Table-per-Hierarchy (TPH)
• Table-per-Type (TPT)
Persistence Ignorance
• POCO
http://www.microsoft.com/downloads/details.aspx?FamilyID=af18e652-9ea7-478b-8b418424b94e3f58&displayLang=en
Code-First
• Início pelo código
• Porque?
– Focado no design do código
– Banco é um detalhe de implementação!
• Oque?
– Codificação de classes, ajustando sua forma com o
ContextBuilder
– Não utiliza EDM!!!
Code-First
Text Template Transformation Toolkit(T4)
• Incluido no Visual Studio 2008
– Suporte em tempo de execução, mas dificuldades
em tempo de design
• T4 com Entity Framework
– T4 utilizado para gerar código do modelo
– Podem ser criados templates T4 customizados
• Lógica de validação
• POCOs
Text Template Transformation Toolkit
Estratégias de validação
• http://stackoverflow.com/questions/191143/e
ntity-framework-validation
Estratégias de validação
Conclusões
• O Entity Framework ajuda no isolamento
entre base de dados e aplicação e aumenta a
padronização do desenvolvimento, gerando
ganho de produtividade, portabilidade e
facilidade de manutenção.
Links interessantes
•
•
•
•
•
•
•
•
•
•
•
•
Blog - Fábio Pandolfo - Slides e recursos deste minicurso
http://dotando.blogspot.com
Data Developer center – Entity Framework
http://msdn.microsoft.com/en-us/data/aa937723.aspx
EF4 Providers
http://msdn.microsoft.com/en-us/data/dd363565.aspx
Artigo – Introdução ao ADO.NET Entity Framework 4
http://www.devmedia.com.br/websys.2/webreader.asp?cat=1&revista=netmagazi
ne_73#a-2559
Artigo – What’s New in Entity Framework 4? Part 1: API Changes
http://www.code-magazine.com/Article.aspx?quickid=0911121
Artigo – What’s New in Entity Framework 4? Part 1: Modeling Changes
http://www.code-magazine.com/article.aspx?quickid=0909081
Links interessantes
•
•
•
•
•
•
•
•
•
•
•
•
Julie Lerman
http://learnentityframework.com/learnentityframework/
Wikipedia - ADO.NET Entity Framework
http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework
Artigo – Entity Framework – Tutorial and Basics
http://www.codeguru.com/csharp/csharp/cs_linq/article.php/c15489
Artigo - EF v2 and Data Access Architecture Best Practices
http://msdn.microsoft.com/en-us/magazine/ee236639.aspx
Video – Entity Framework – What, How, Why
http://channel9.msdn.com/shows/Going+Deep/ADONET-Entity-Framework-WhatHow-Why/
Video – Entity Framework – Entity DataSource
http://channel9.msdn.com/posts/bursteg/Overview-of-the-EntityDataSource-Thenew-ASPNet-Data-Source/
Links interessantes
•
•
•
•
•
•
•
•
•
•
•
•
Linq to Entities vs ESQL
http://stackoverflow.com/questions/38647/linq-to-entities-vs-esql
Some differences between ESQL and LINQ to Entities capabilities
http://blogs.msdn.com/diego/archive/2007/12/20/some-differences-between-esqland-linq-to-entities-capabilities.aspx
Choosing an Entity Framework API
http://blogs.msdn.com/diego/archive/2007/11/11/choosing-an-entity-frameworkapi.aspx
Building N-Tier applications with the EF – The Basics
http://blogs.msdn.com/b/dsimmons/archive/2009/04/09/building-n-tier-applicationswith-the-ef-the-basics.aspx
N-Tier Application Patterns
http://msdn.microsoft.com/en-us/magazine/ee321569.aspx
Cenários Distribuídos
http://unplugged.giggio.net/unplugged/post/Entity-Framework-em-cenariosdistribuidos.aspx
Livros recomendados
http://apress.com/book/view/159059990X
Pro Entity Framework 4.0
http://apress.com/book/view/1430227036
Entity Framework 4.0 Recipes
Livros recomendados
http://oreilly.com/catalog/9780596520298
Programming Entity Framework
http://www.manning.com/mostarda/
Entity Framework in Action
Livros recomendados
http://www.wrox.com/WileyCDA/WroxTitle/Professional-C-4-0-and-NET4.productCd-0470502258.html
C# 4 and .NET 4
Download

introduoaoentityframework4-100607235702-phpapp01