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