Mostrando postagens com marcador Entity Framework. Mostrar todas as postagens
Mostrando postagens com marcador Entity Framework. Mostrar todas as postagens

quinta-feira, 28 de julho de 2016

Entity Framework e lazy loading

A cada dia que passa fica mais comum encontramos soluções com camadas de mapeamento objeto-relacional (ORM), simplificando o acesso a dados para os desenvolvedores.
Ressalto que não sou contra o Entity Framework, hibernate ou outros frameworks de mapeamento objeto relacional, só quero que as pessoas que o utilizam tomem cuidados básicos no acesso a dados, pois não existe mágica…

Banco de dados


Utilize o script abaixo para criar um banco de dados de exemplo com três tabelas, Pessoa, Endereço e Telefone, inserindo também alguns registros.
Ok, eu sei que você modelaria diferente, pois uma pessoa pode ter mais de um endereço ou telefone, mas para este exemplo a regra de negócio da Lutilândia não permite.

CREATE DATABASE EF
GO
USE EF
GO
IF (OBJECT_ID('dbo.Pessoa') IS NOT NULL)
DROP TABLE dbo.Pessoa
go
IF (OBJECT_ID('dbo.Endereco') IS NOT NULL)
DROP TABLE dbo.Endereco
GO
IF (OBJECT_ID('dbo.Telefone') IS NOT NULL)
DROP TABLE dbo.Telefone
go

CREATE TABLE dbo.Endereco
(ID INT IDENTITY NOT NULL PRIMARY KEY,
 Descricao VARCHAR(500) NOT NULL)
GO

CREATE TABLE dbo.Telefone
(ID INT IDENTITY NOT NULL PRIMARY KEY,
 Descricao VARCHAR(500) NOT NULL)
GO

CREATE TABLE dbo.Pessoa
(Codigo INT IDENTITY NOT NULL PRIMARY KEY,
 Nome VARCHAR(100) NOT NULL,
 IdEndereco INT NULL,
 IdTelefone INT NULL
 )
GO

ALTER TABLE dbo.Pessoa
ADD CONSTRAINT fk_Pessoa_Endereco_ID 
FOREIGN KEY (IdEndereco)
REFERENCES dbo.Endereco (ID)
GO

ALTER TABLE dbo.Pessoa
ADD CONSTRAINT fk_Pessoa_Telefone_ID 
FOREIGN KEY (IdTelefone)
REFERENCES dbo.Telefone (ID)
GO

INSERT INTO dbo.Endereco (Descricao)
SELECT TOP 100000 O.description
FROM sys.dm_xe_map_values AS M
CROSS JOIN sys.dm_xe_objects AS O
GO

INSERT INTO dbo.Telefone (Descricao)
SELECT TOP 100000 O.description
FROM sys.dm_xe_map_values AS M
CROSS JOIN sys.dm_xe_objects AS O
GO

INSERT INTO dbo.Pessoa (Nome)
SELECT TOP 1000000 M.name
FROM sys.dm_xe_map_values AS M
CROSS JOIN sys.dm_xe_objects AS O
GO

UPDATE dbo.Pessoa
SET IdEndereco = (Codigo % 100000) + 1
, IdTelefone = (Codigo % 100000) + 1
GO

Lazy loading

Utilizando o Entity Framework 6.0, o comportamento padrão do EF é que o contexto trabalhe com lazy loading. O que isso significa?

Para quem está seguindo o script, crie um projeto C# Console no Visual Studio e…

    1. Adicione um ADO.NET Entity Data Model (chame do que quiser)
    2. Escolha EF Designer from database
    3. Aponte para seu banco de dados EF (pode manter o nome EFEntities)
    4. Selecione as tabelas Pessoa, Endereco e Telefone
    5. Clique em Finish

Depois da geração do modelo você vai ver algo similar a imagem abaixo:



Edite seu método Main e coloque o código abaixo. O objetivo do código é buscar quase 10000 pessoas e depois fazer algo simples, acessando o endereço e telefone do indivíduo (note que não me interessa gerar saída alguma, só o acesso ao banco de dados).

String s = "";
DateTime dt = DateTime.Now;

EFEntities contexto = new EFEntities();
var r = contexto.Pessoas.Where(x => x.Codigo < 10000);

foreach (var p in r.ToList())
{
    s = "Nome: " + p.Nome + " - Endereço: " + p.Endereco.Descricao + " - Telefone: " + p.Telefone.Descricao;
}
Console.WriteLine(DateTime.Now.Subtract(dt).Seconds.ToString());

A execução dessa aplicação na minha máquina levou algo em torno de 12 segundos, nada demais para o desenvolvedor que está executando este código, então poucos fazem uma análise mais detalhada, como faremos a seguir.

Utilizando o profiler para monitorar os eventos SQL:BatchCompleted e RPC:Completed, toda vez que o Entity Framework acessa a coluna Descrição da entidade Endereco ou Telefone, uma chamada é feita para o SQL Server (note o @EntityKeyValue1 variando), o que neste exemplo gerou 39998 entradas no profiler.

Essas chamadas são feitas porque o EF vai "preguiçosamente" (lazy) pedindo para o SQL Server os elementos de outras entidades, varrendo o resultado retornado após o acesso ao elemento Pessoa (primeira consulta exibida na imagem abaixo).


Eager loading

Caso você queira que o Entity Framework não trabalhe com esse comportamento de lazy loading, você pode alterar no seu código a utilização do contexto, adicionando o método "Include", que por debaixo dos planos já busca todos os elementos.

var r = contexto.Pessoas.Include("Endereco").Include("Telefone").Where(x => x.Codigo < 10000);

Analisando a execução deste novo código, temos APENAS DUAS linhas na saída do profiler, onde notamos que o EF enviou para o SQL Server uma única consulta fazendo o join entre as três tabelas, já retornando o endereço e telefone. Dessa forma evitamos N round-trips entre o cliente e o servidor, fazendo com que em minha máquina o tempo total de execução ficasse em torno de 3 segundos.


Desempenho da aplicação


A diferença entre 3 e 12 segundos é onde mora o perigo... Talvez testando a solução em sua máquina, os 9 segundos não sejam significativos para os desenvolvedores, e um build sem a análise de desempenho ou do número de chamadas acabe chegando em produção.

Se a solução é para controlar o nome dos envolvidos no próximo bolão do campeonato lá na sua empresa, tudo tranquilo, porém caso a solução tenha milhares de requisições pesquisando por pessoas específicas, o número de chamadas ao banco de dados será muito grande. E dependendo da forma como a aplicação está gerenciando e utilizando os seus recursos (ou consumindo os registros), ela mesmo pode ser tornar o gargalo, que não respondendo adequadamente vai deixar o SQL Server cheio de requisições com espera do tipo ASYNC_NETWORK_IO (e NÃO É PROBLEMA DE REDE, ok?!!).

É meio óbvio que para escrever este artigo eu já encontrei diversos problemas de desempenho em aplicações por conta do Lazy Loading. O que em um primeiro momento sempre foi apontado como problema no banco de dados, conseguimos rastrear até apontar o comportamento indevido da aplicação. Então peço para que façam uma análise mais criteriosa de como o seu framework de mapeamento OR acessa o banco de dados, sempre entendendo o perfil das requisições e como pode utilizar da melhor forma o framework adotado.

Então estou falando para nunca usar lazy loading ou até configurar o contexto (this.Configuration.LazyLoadingEnabled = false) para impedir que um desenvolvedor desavisado faça uso do lazy load?
Claro que não, quero que você entenda que o maior custo de IO e CPU visto em uma única consulta com eager loading pode ser muito inferior quando comparado ao tempo total de execução do round-trip de milhares de chamadas para o SQL Server.

No fim tudo depende, só precisamos fazer as perguntas certas e achar as respostas adequadas, então espero que você guarde mais essa informação no seu repertório de soluções.

Abraços

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

terça-feira, 23 de março de 2010

[Artigo] Herança no EF4 e Identity no SSDL

Este artigo descreve brevemente o uso de herança (type per hierarchy) no Entity Framework 4.0, mas destaca um problema que enfrentei com o modelo de entidades quando estava fazendo o mapeamento a partir do banco de dados.
No fim o problema talvez poderá ser resolvido com o RTM do Visual Studio 2010 ou continuar em aberto (existe uma entrada no connect), então pode ser que você precise de uma mãozinha sobre o assunto.

No artigo eu também comento sobre as exceções “A member named cannot be defined in class . It is defined in ancestor class ” e “A value shared across entities or associations is generated in more than one location. Check that mapping does not split an EntityKey to multiple store-generated columns”.

Parti do pressuposto que você já conhece um pouco do Entity Framework, caso contrário, eu já gravei alguns webcasts sobre o assunto e um artigo que escrevi sobre as novidades do EF 4.0 deve sair qualquer dia desses em uma publicação nacional.

Quer ver o artigo completo? Baixe-o aqui.



[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm

quinta-feira, 22 de outubro de 2009

Resultado webcast - Entity Framework 4.0

Hoje eu ministrei um webcast sobre algumas das novidades no Entity Framework 4.0. Curiosamente a apresentação caiu na semana do lançamento do Visual Studio 2010 Beta 2 e .NET Framework 4.0 Beta 2, mas como eu não tinha certeza sobre a existência do EF Features CTP 1 junto com o Beta 2 (e outros motivos), acabei ficando com o Beta 1 + EF Features CTP 1.

A agenda do webcast foi:

• Um pouco de história
• Novidades do EF 4.0 Beta 1 e Feature CTP 1
• Demos
• Novidades do EF 4.0 Beta 2
• Roadmap?
• Conclusão

Antes de começar o webcast eu passei por um bom aperto, acabou a luz em metade de Brasília, saí correndo do escritório para a casa da mãe, lá é claro que a NET estava fora do ar (Murphy?) e tive que usar um modem emprestado que nem 3G era. Início torto, atrasado e corrido, mas depois eu acho que tudo correu bem e fomos acabar por volta de 13:40h.

Minha análise do webcast: falei muito de pressa e muita coisa (para variar), tivemos constantemente mais de 100 pessoas na sala, o que mostra claramente que o EF gera muito interesse, as demos funcionaram bem e ainda houveram muitas, mas muitas perguntas mesmo. Por fim achei o webcast bom, mas sempre têm algo que não gosto.

Se você não viu, a gravação deve estar disponível em breve no mídia center do MSDN. Deixo aqui as soluções no VS2008 e VS2010, além do PDF do PPT. Download.



Quais são os próximos passos? Continuar destrinchando o Entity Framework 4.0, pois não é uma tecnologia simples, e trabalhar com seu uso e adequação à arquitetura do projeto, que é de suma importância para o sucesso do mesmo. Ainda têm muita coisa que preciso entender em detalhes para ficar 100% seguro com o distinto, e hoje foi só o começo, agora só precisamos ficar antenado em mais uma tecnologia...

[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm

quarta-feira, 21 de outubro de 2009

Visual Studio 2010 e .NET Framework 4 - Beta 2

Bom, para quem assina RSSs, o dia de segunda foi repleto de posts sobre o lançamento do Visual Studio 2010 e .NET Framework 4.0, ambos beta 2. Depois de dar uma olhada nos posts e iniciar o download através da assinatura do MSDN, tive que controlar minha ansiedade e deixar para instalar ambos posteriormente. Explico os motivos:

- Não consegui uma informação clara sobre o Entity Framewok. Tenho instalado o VS2010 Beta 1 e o Entity Framework feature pack CTP1, que me trás algumas novidades que espero ver na versão final do EF (e não em um SP1, tomara!), mas o anúncio do time de produto não deixa claro se esses recursos estão todos disponíveis no beta 2. Pelo comentário do Fredrik Knutson, parece que a resposta é negativa.
Veja o anúncio formal e se o roadmap te interessa, deixe um comentário em: http://blogs.msdn.com/adonet/archive/2009/10/19/vs2010-and-net-framework-beta-2-announced.aspx

- Azure Tools for Visual Studio. Se você está desenvolvendo com o Azure, sabe que instala o SDK e o Azure Tools for Visual Studio. Mas se você desinstalar o beta 1 e colocar o beta 2, mesmo reinstalando as ferramentas do Azure, elas não deverão funcionar. O jeito é esperar pelo CTP de novembro: http://beta.blogs.msdn.com/jnak/archive/2009/10/18/windows-azure-tools-and-visual-studio-2010.aspx
Se você está apenas utilizando o StorageClient, a coisa toda deve funcionar sem problema.
Tomara que nesse CTP eles compilem o development storage com o 4.0 e não com o 3.5, facilitando a vida de quem está gerando a DLL com o TableStorageDataServiceContext através do VS2010, mas isso é assunto para um outro post.

- Integração entre o Visual Studio 2010 beta 2 e o Team Foundation Beta 1. Em um primeiro momento, eu não quero colocar o TFS Beta 2, pois exige uma preparação cuidadosa e tenho que garantir que os artefatos que eu tenho armazenados não serão perdidos em um erro de operação. O problema é que não existe garantia do VS beta 2 funcionar com o TFS beta 1, segundo o Brian Keller: http://social.msdn.microsoft.com/Forums/en/tfsprerelease/thread/e8185f70-aa69-4ddd-80f9-2508115916b7

De qualquer forma, se você está preparando uma instalação do TFS Beta 2, aconselho dar uma olhada neste guia que está sendo preparado - TFS 2010 Beta 2 Deployment Checklist:
http://geekswithblogs.net/aaronsblog/archive/2009/10/04/135297.aspx

Uma excelente notícia sobre o beta 2 é a licença "Go-Live", que significa que nós podemos utilizar os produtos para projetos em produção. Lembro de ver em um post que, se não me engano, você precisa se cadastrar para ter esse suporte. Vou ver como funciona e depois retorno para vocês.

Agora, se você não possui nenhum desses requisitos, eu aconselho correr no site e começar a fazer download do seu Visual Studio 2010 beta 2, que aparentemente já está disponível para todo mundo, não só assinantes do MSDN. Para mim o jeito vai ser voltar para as VPCs e brincar com o distinto fora da máquina física...

=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
Atualizado em 27/10/2009

O time do EF anuncionou que eles estão trabalhando no Feature CTP para o Visual Studio 2010 Beta 2. E esperar para ver... http://blogs.msdn.com/adonet/archive/2009/10/26/upcoming-ado-net-entity-framework-feature-community-technology-preview-for-visual-studio-2010-beta-2.aspx

Seja paciente! :-)

=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=

[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm

terça-feira, 20 de outubro de 2009

Webcast da semana - Novidades no EF 4.0

Durante a correira da semana eu estou encontrando um tempinho para falar um pouco sobre as novidades do Entity Framework 4.0, webcast que acontecerá nessa quinta-feira. Gosta do assunto e quer saber o que o time de produto anda preparando para nós? Então reserve um tempinho na agenda e venha conferir...

A URL para cadastro no evento e participação é: https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032423387&EventCategory=4&culture=pt-BR&CountryCode=BR

Eu também estou dando uma olhada no que temos de novo com o .NET Framework 4.0 Beta 2, que saiu ONTEM para assintantes do MSDN! Espero conseguir sanar algumas dúvidas que eu tive e mostrar tudo isso para você nessa quinta.

[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm

sexta-feira, 16 de outubro de 2009

Evento Java versus .NET 2009

Oi pessoal, tudo bem?

Depois de alguns anos sem acontecer o famoso evento Java versus .NET em Brasília, em 2009 o evento volta a dar o ar da graça. Dessa vez o evento será divido em dois dias, sendo que o primeiro acontecerá em 8 dias, sábado 24/10.

Além de assistir a alguns debates, eu estarei presente no evento apresentando sobre EF, Linq to SQL e Astoria, no Tema 3: Acesso a dados e mapeamento objeto-relacional (ORM), que acontecerá sábado, 24 de outubro de 2009 (14:00 às 16:00).

Aproveitando, eu vou falar o que sinceramente espero do evento: eu gostaria de ver poucos xiitas dos dois lados, uma análise de qualidade dos frameworks e um belo comparativo das plataformas.

Por conta do acaso eu comecei a trabalhar com a plataforma Microsoft e não parei mais, porém estou vivendo um dilema fuderoso (posso escrever isso?), pois quero saber mais sobre WCF, WF, WPF, Azure, SQL, VSTS, TFS, Sharepoint, EF, Astoria, LINQ, MIF, DSL, ASP.NET MVC, AJAX, DDD, DD, metodologias,… Mas é humanamente impossível.
Não sei quanto a vocês, mas além da plataforma que trabalho, eu morro de curiosidade de saber mais sobre tudo. Gostaria de saber mais sobre o JEE 6, JSF 2, JPA 2, EJB 3, e como são tratadas questão de segurança, integração, workflow, testes, BI, em outras plataformas, entendendo onde uma está melhor que a outra e quais avanços podemos esperar em ambas.

Espero que eu consiga sair do evento com uma visão mais ampla e que os profissionais de TI já tenham percebido que é possível fazer coisas maravilhosas com qualquer uma das plataformas, mas que o principal problema de hoje é termos profissionais fazendo um trabalho de merda, e não é usuário ou negócio que estão errados, como alguns pensam.

Informações detalhadas sobre o evento podem ser encontradas no site: http://www.javaversusdotnet.com.br. Abaixo, estão destacadas algumas das principais informações sobre o evento.

· Motivação do evento - Por que participar?
http://www.javaversusdotnet.com.br/Motivacao.aspx

· Objetivos e organização do evento
http://www.javaversusdotnet.com.br/Objetivos.aspx

· Programação do evento
http://www.javaversusdotnet.com.br/Programacao.aspx

· Palestrantes da Plataforma Java
http://www.javaversusdotnet.com.br/PalestrantesJava.aspx

· Palestrantes da Plataforma .NET
http://www.javaversusdotnet.com.br/PalestrantesDotNet.aspx

· Todos parceiros do evento
http://www.javaversusdotnet.com.br/Apoio.aspx

· Apoio social
http://www.javaversusdotnet.com.br/Beneficencia.aspx

· Inscrição no evento
http://www.javaversusdotnet.com.br/Inscricao.aspx

· Local de realização do evento
http://www.javaversusdotnet.com.br/Local.aspx

· Imagens disponíveis para divulgação do evento
http://www.javaversusdotnet.com.br/ImprensaImagens.aspx

Nos vemos lá? Espero que sim...
Se alguém quiser um desconto na inscrição do evento, mandar um e-mail para luciano.moreira@srnimbus.com.br.


[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm