Pontos de dados

Entity Framework Designer ganha atenção no Visual Studio 2012

Julie Lerman

 

Devo admitir que estou bastante encantada com o uso de Code First para compilar modelos de domínio que podem ser usados pelo Entity Framework. E eu não prestei muita atenção nos modelos EDMX, os quais podem ser compilados usando o Entity Framework Designer por meio dos modelos Database First ou Model First. Consulte em minha coluna de maio de 2011: “Desmistificando estratégias do Entity Framework: Fluxo de trabalho de criação de modelos” (msdn.microsoft.com/magazine/hh148150) para saber mais sobre as diferenças entre Code First, Model First e Database First.

Entretanto, há muito tempo, eu vivenciei o designer. Pronto para as brincadeiras do tipo “Sou tão velho que...”? Sou tão velha que usei o Entity Framework quando você tinha que trabalhar com XML bruto porque não existia nenhum designer. É verdade. Isso foi durante os primeiros betas, antes da primeira versão. Por isso, o designer fornecido no Visual Studio 2008 foi uma enorme bênção. A Microsoft realizou um excelente trabalho, embora seja sempre mais fácil encontrar maneiras de como poderia ser melhor… ou de reclamar sobre o que não existe. No Visual Studio 2010, obtivemos o suporte ao Model First e a alguns outros recursos interessantes no designer, como o suporte à pluralização e à chave estrangeira.

Agora, o Visual Studio 2012 apresenta um designer ainda mais aprimorado. Existem duas grandes mudanças, mas também muitos pequenos ajustes que tornam a vida mais fácil e colocam um sorriso em meu rosto — e, espero, no seu também.

1, 2, 3, cor!

Você talvez já tenha ouvido falar sobre um notável aprimoramento: a capacidade de adicionar cor às entidades no designer. E ele é um recurso bastante simples de usar. É possível selecionar uma ou mais entidades e, em seguida, na janela de propriedades, escolher uma cor para elas, conforme exibido na Figura 1. A cor é excelente para marcar as entidades visualmente. Quando você abre um modelo, fica muito fácil verificar que determinadas entidades estão relacionadas entre si dentro do modelo. Mesmo em um modelo pequeno, como o da Figura 2, fica claro o quanto isso pode ser útil.


Figura 1 - Alterando a cor das entidades


Figura 2 - Visualização fácil de agrupamentos de entidades por meio de cores

Organização com diagramas

O debate continua em relação a quantas entidades são demais para um modelo. Para mim, mais de 20 ou 30 entidades em um único modelo é visual e fisicamente não gerenciável. Quero dizer que é visualmente difícil obter todas as informações de uma só vez e que, quando desejo trabalhar em uma ou mais entidades no designer, isso pode ser complicado. Frequentemente, eu recorro ao Pesquisador de Modelos do designer para me ajudar a localizar uma entidade na superfície de design. Com modelos enormes (centenas e centenas de entidades — algo que eu simplesmente nunca tentei), você pode enfrentar problemas de desempenho em tempo de design e tempo e execução. No Microsoft Data Developer Center, consulte o tópico “Considerações sobre desempenho para o Entity Framework 5” em bit.ly/OZTiUL. Existem designers EDMX de terceiros que superam esse problema assumindo uma abordagem diferente ao trabalhar com modelos grandes. Eu prefiro criar modelos pequenos para serem usados em todos os meus aplicativos, mas isso nem sempre é uma opção. Ter a capacidade de gerenciar muitas entidades em um único modelo no designer é importante.

O novo designer ajuda os desenvolvedores com esse problema ao fornecer um recurso solicitado com frequência: os diagramas. Com diagramas de modelos, é possível criar exibições de tempo de design diferentes das que estão no modelo. Você talvez queira ter uma exibição que mostre todo o modelo, como aquela na Figura 2, e usar diagramas adicionais para representar maneiras diferentes de agrupar entidades. O designer fornece uma grande variedade de abordagens para a criação de diagramas, mas tome cuidado com as funções que irão mover a entidade, em vez de duplicá-la.

Por exemplo, eu quero um diagrama que apresente apenas as entidades de que irei necessitar ao me concentrar no gerenciamento de clientes em tempo de design. Isso pode ser Customer e ShippingAddresses neste modelo em particular. Existem algumas maneiras de você conseguir isso. Uma é selecionar essas entidades, clicar com o botão direito do mouse nelas e escolher a opção Mover para o Novo Diagrama no menu de contexto. Isso criará um novo diagrama com apenas as duas entidades, conforme mostrado na Figura 3. Mas, como eu usei a opção Mover, essas duas entidades serão removidas do diagrama principal. Você deve ter cuidado se desejar manter um único diagrama de todo o modelo. Eu gosto do fato de o diagrama não ser um reflexo do esquema do modelo já que é possível ver as propriedades de navegação (por exemplo, Customer.Orders), embora nesse diagrama em particular a entidade Orders não esteja visível.


Figura 3 - Diagrama criado usando o recurso Moer para o Novo Diagrama

Você também pode criar e gerenciar diagramas por meio do Pesquisador de Modelos do designer, exibido na Figura 4. No Pesquisador de Modelos, é possível selecionar o diagrama a ser exibido, bem como adicionar e excluir diagramas. Você também pode arrastar entidades do modelo (por exemplo, na seção Entity Types de Company­DatabaseModel) para uma superfície de diagrama. Dessa maneira, se eu quiser que Customer e ShippingAddress permaneçam no Diagrama 1, eu posso criar um novo diagrama a partir do Pesquisador de Modelos e, em seguida, arrastar Customer e ShippingAddress para a superfície. 


Figura 4 - Gerenciamento de diagramas a partir do Pesquisador de Modelos

Além disso, você pode copiar e colar entidades de um diagrama para outro e qualquer associação relevante as acompanhará.

Lembre-se de que os diagramas são exibições em tempo de design, elas não definem o modelo em sua integralidade. Você pode sempre visualizar o modelo completo no Pesquisador de Modelos. Entretanto, a duplicação de entidades de um diagrama para outro não tem efeito em seu modelo ou aplicativo. Mas elas não são exibições somente leitura. Você pode criar seu modelo e suas entidades nesses diagramas e as alterações afetarão o modelo subjacente. Eu também aprecio o fato de que é possível clicar com o botão direito do mouse em qualquer entidade de um diagrama e escolher a opção “Incluir Relacionado” para obter todas as entidades que estiverem diretamente relacionadas.

Geração de código padrão: POCOs e DbContext

Outra alteração que me fez sorrir quando a descobri é que, por padrão, o assistente para a criação de um novo Modelo de Dados de Entidade agora usa o modelo DbContext T4 do Entity Framework 5. Desde o lançamento do Entity Framework 4.1 (que incluía o Code First e a API DbContext), a equipe do EF recomenda que os desenvolvedores iniciem novos projetos com as classes DbContext e POCO (Plain Old CLR Object), em vez de ObjectContext do .NET 4 e de classes que herdam de EntityObject. Entretanto, o Visual Studio 2010 utiliza um modelo de geração de código que define ObjectContext e Entity­Objects como padrão. Ficava a critério dos desenvolvedores a instalação do pacote EntityFramework.dll NuGet e a mudança de seus EDMX para usar o modelo DbContext. Isso significa que você tinha de estar ciente da nova diretriz e agir em relação a ela.

Agora, o designer define como padrão o uso do modelo EF 5.x DbContext Generator, a criação de uma classe DbContext e POCOs que são muito mais fáceis de usar em seus aplicativos do que os tipos anteriores. O assistente também irá obter a referência para EntityFramework.dll, que está instalada em seu computador juntamente com o Visual Studio 2012, de forma que você nem precise de uma conexão com a Internet.

Você pode facilmente reverter para o uso de ObjectContext. No Microsoft Data Developer Center, consulte o tópico “Voltando para a geração de código com ObjectContext” em bit.ly/OFjcLa.

Definição de tipos enum

O Microsoft .NET Framework 4.5 oferece suporte a enum ao Entity Framework. Você pode usar enums com EDMX e Code First. Com o EDMX, o modelo deve conhecer os tipos enum de forma que o Entity Framework saiba como transformá-los a fim de mapeá-los para tipos de bancos de dados. O Entity Framework Designer permite que você faça isso de maneira bastante fácil.

Se você fizer a engenharia reversa de um banco de dados para um modelo EDMX, o assistente interpretará as colunas do banco de dados como tipos .NET. Você terá, então, de definir seus tipos enum e corrigir as propriedades. Vamos dar uma olhada rápida nesse processo.

A entidade Return em meu modelo possui uma propriedade chamada Reason que faz o mapeamento para um inteiro. Eu quero representar a propriedade Reason como um enum, em vez de ter uma tabela de banco de dados e uma entidade extras, e eu posso fazer essa alteração no designer. Clique com o botão direito no mouse no plano de fundo do designer e, em Adicionar Novo, você verá que Tipo Enum é um novo item da lista. Selecione-o para obter o assistente Tipo Enum, no qual é possível definir o enum da mesma maneira que fiz na Figura 5. Os tipos enum não ficam visíveis na superfície do designer, mas você sempre pode encontrá-los (para visualizar, editar ou exclui) no Pesquisador de Modelos.


Figura 5 - Definindo um tipo enum

Agora que o modelo está ciente desse tipo enum, eu posso usá-lo em minhas entidades. Voltarei para a entidade Return e editarei as Propriedades da propriedade Reason. Originalmente, o tipo era Int32. O novo tipo enum é exibido na lista suspensa Tipo, conforme mostrado na Figura 6, mas você deve rolar para baixo para encontrá-lo. Após selecionar o tipo, o Entity Framework sabe como transformar um enum em um valor de banco de dados se você estiver escrevendo consultas LINQ, recuperando ou atualizando dados.


Figura 6 - Selecionando um novo tipo enum

Aqui, por exemplo, é uma consulta LINQ que filtra com base no enum ReturnReason:

var returns = context.Returns.Where(
  r => r.Reason == ReturnReason.Broken).ToList();

Quando a consulta é executada no banco de dados, o enum Broken é transformado em seu valor enum, 3, conforme exibido nesse trecho de TSQL:

    WHERE 3 =  CAST( [Extent1].[Reason] AS int)

Você talvez tenha percebido as caixas de seleção Definir atributo Sinalizadores e Tipo externo de referência na Figura 5. O EF oferece suporte a enums bit a bit, o que permite que você combine enums ao definir ou consultar dados. O atributo Set Flags especifica que o enum será bit a bit. Pawel Kadluczka da equipe do EF tem um excelente postagem de blog: “Usando tipos enum existentes no Entity Framework 5” (bit.ly/QIUz6y), que fornece uma explicação detalhada da funcionalidade da caixa de seleção Tipo externo de referência.

Lembre-se de que, no momento da redação deste artigo, o WCF Data Services 5 não reconhece tipos enum. Leia mais sobre esse problema no blog da equipe do WCF Data Services em blogs.msdn.com/astoriateam.

Importação em lotes de procedimentos armazenados

A Figura 7 mostra outro recurso que eu me lembro de ter perguntado há muito tempo e estou bastante feliz de vê-lo no Assistente de Modelo de Dados de Entidade do Visual Studio 2012. O designer no Visual Studio 2010 permite mapear procedimentos armazenados para tipos complexos, mas você deve fazer isso com um procedimento por vez. Esse recurso ainda existe, mas, agora, existe um atalho. Ao criar um modelo Database First, o assistente pode criar as funções a partir dos procedimentos armazenados, todos de uma só vez, e ele também criará os tipos complexos necessários para os quais as funções serão mapeadas.


Figura 7 - Criando importações de funções a partir de procedimentos armazenados

A Figura 8 mostra as importações de nova função e seus tipos complexos relacionados no pesquisador de modelos. Eu normalmente não gosto de usar os nomes padrão criados pelo assistente. Ainda assim, é mais rápido deixá-lo criar esses ativos para mim e, em seguida, editar os nomes do que eu ter de criá-los um por um.


Figura 8 - As importações de nova função

Se desejar criar importações de função a partir de alguns dos procedimentos armazenados e criar mapeamentos de entidade (ou seja, usar Insert­Contact sempre que você adicionar um novo contato e chamar SaveChanges) a partir de alguns outros, eu recomendo que você faça isso em dois passos. No primeiro passo, você deve selecionar apenas os procedimentos armazenados que devem ser importados como funções e seus tipos complexos relevantes. Em seguida, usando o recurso Atualizar Modelo a Partir do Banco de Dados, você pode selecionar os procedimentos que deseja usar para o mapeamento e garantir que a caixa de seleção “Importar funções e procedimentos armazenados…” não esteja marcada nesse segundo passo.

Suporte geográfico e a TVFs

O EF5 oferece suporte ao mapeamento para TVFs (Funções de Valores de Tabela) e a dados espaciais (como SqlGeography e SqlGeometry), e o designer também oferece suporte a esses recursos. Você pode descobrir como usar o designer para aproveitar esses mapeamentos lendo os artigos passo a passo relacionados a TVFs e tipos espaciais em bit.ly/QCppJJ e bit.ly/VdbEUP, respectivamente.

Da mesma maneira que com o suporte a enum, observe que o WCF Data Services 5 não oferece suporte para os tipos geográficos que você pode definir em seu modelo do EF5.

São as pequenas coisas

Existe uma enorme quantidade de aprimoramentos menores no Entity Framework Designer que resultam em um grande efeito geral, tornando o uso do designer uma experiência mais suave.

Mover propriedades No designer, você pode reorganizar as propriedades em uma entidade, de forma que elas sejam listadas na ordem de sua preferência. Em versões anteriores, a única maneira de fazer isso era editando o XML diretamente.

Esquema na seleção de tabela Quando você cria um modelo Database First ou atualiza um modelo a partir do banco de dados, as tabelas, as exibições e outros objetos do banco de dados agora são organizados por nome de esquema. Se teve o trabalho de organizar os objetos de seu banco de dados por esquema, você se beneficiará aqui por ser capaz de localizar os objetos mais facilmente. E você poderá eliminar objetos que não fazem parte de seu domínio com facilidade, como as tabelas do esquema dbo exibidas na Figura 9.


Figura 9 - Agrupando objetos do banco de dados por nome de esquema

A faceta da coluna altera a reflexão na atualização de modelos O Assistente Atualizar Modelo a Partir do Banco de Dados agora seleciona alterações para as facetas da coluna — Scale, Precision, MaxLength, Nullable, Unicode and FixedLength — e as aplica nas propriedades relevantes de seu modelo. Essa será uma alteração bem-vinda para muitos desenvolvedores. Você ainda deverá corrigir mapeamentos desfeitos quando fizer alterações nos tipos de coluna. O MSDN possui uma descrição completa dos efeitos no documento “Alterações feitas em um arquivo .edmx pelo assistente de atualização de modelo” (bit.ly/PTOwKB). No momento da redação deste artigo, a seção que descreve as alterações na coluna não incluía os novos detalhes sobre as facetas.

Realçar entidades relacionadas no momento da seleção Esse é outro pequeno aprimoramento que pode ajudar você a compreender de maneira visível o seu modelo: Ao selecionar uma entidade ou associação no designer, as entidades relacionadas também são realçadas.

Uma observação sobre o item de refatoração no menu de contexto Versões de pré-lançamento do Visual Studio 2012 incluíam um recurso de designer que refatorava códigos dependentes se você renomeasse uma entidade ou uma propriedade. Esse recurso não está presente na versão final do Visual Studio 2012, mas existem alguns artefatos no designer que podem causar uma pequena confusão. O menu de contexto possui um item Refatorar com Renomear no submenu. Se você escolher Renomear a partir do menu Refatorar, uma janela será exibida indicando que nenhum código será alterado. Como a refatoração não ocorrerá, essa janela nunca listará nada.

Aprimoramentos robustos

Embora este artigo esteja concentrado em novos recursos específicos do Entity Framework Designer no Visual Studio 2012, existem outros aprimoramentos no EF5 que devem ser destacados. O mais notável é a maneira como o desempenho subjacente foi aprimorado. Graças às novas Consultas Compiladas Automaticamente. Você pode ler sobre isso na postagem do blog da equipe “Pré-estreia: melhorias no desempenho do Entity Framework 5.0”, em bit.ly/PLWu5l. Independentemente de você estar compilando seus modelos usando o Entity Framework Designer ou aproveitando o Code First para criar seus modelos, existe muito a ser descoberto com o EF5.

Julie Lerman é uma Microsoft MVP, mentora e consultora do .NET, que reside nas colinas de Vermont. Você pode encontrá-la fazendo apresentações sobre acesso a dados e outros tópicos do Microsoft .NET em grupos de usuários e conferências em todo o mundo. Seu blog está em thedatafarm.com/blog e ela é autora do livro “Programming Entity Framework” (2010), além das edições Code First (2011) e DbContext (2012), todos da O’Reilly Media. Siga-a no Twitter, em twitter.com/julielerman.

Agradecemos ao seguinte especialista técnico pela revisão deste artigo: Lawrence Jones