Entity Framework - Escolhendo um WorkFlow


Um dos fatores chaves para começar trabalhar de forma produtiva e eficiente com o Entity Framework é criar um ambiente de trabalho ordenado onde as tarefas são realizadas em de uma certa maneira definida e com resultados previsíveis.

Definir um workflow (fluxo de trabalho) é uma das tarefas mais importantes para poder criar um ambiente ordenado para o desenvolvimento, pois isso garante uma forma de acompanhar as tarefas e da produtividade ao seu trabalho.

Quando você trabalha com o Entity Framework existem 3 workflows comuns que podem ser adotados:

  1. Code First
  2. Model First
  3. Database First

Você escolhe e usa cada um destes workflows conforme suas necessidades e sob condições específicas. Por isso é muito importante compreender cada workflow pois isso te conduzira aos resultados desejados.

Este artigo apresenta um resumo sobre cada um dos 3 workflows atuais do Entity Framework apresentando informações para ajudá-lo a escolher a melhor estratégia de utilização do Entity Framework.

Compreendendo o workflow Code-First

O fluxo de trabalho Code-First (introduzido no Entity Framework 4.1) é comumente usado quando você já possui uma aplicação (ou código existente) que modela uma estrutura de banco de dados.

O código é constituído por uma ou mais classes que definem o modelo de dados e, em seguida, invoca o código adicional para definir o modo como as classes irão interagir.

Então se você esta criando um novo banco de dados use o Code First para definir o seu modelo no código e então gerar o banco de dados.

Se você já possui um banco de dados você pode usar o Code First para criar um código baseado no modelo que mapeia para o banco de dados existente.

Por exemplo, você pode criar uma classe chamada Livro que define as propriedades para identificar um livro em uma coleção, estas propriedades, em seguida, definir o modelo de banco de dados, como mostrado a seguir:

public class Livro
{
  // Define os campos usados no banco de dados
  public Int32 LivroID { get; set; }
  public String Nome { get; set; }
  public String Autor { get; set; }
  public String ISBN { get; set; }
  public Int32 Paginas { get; set; }
  public DateTime DataPublicacao { get; set; }
}

Você pode usar esta classe em uma aplicação sem ter que criar um banco de dados.

Você pode então armazenar os dados desta classe em disco como um arquivo XML, se desejar, ou você pode continuar a usá-la como um banco de dados em memória para fins de testes.

No entanto, conforme sua aplicação fica mais complexa, você pode decidir que armazenar as informações em um banco de dados seja realmente necessário.

Este é o ponto no qual o fluxo de trabalho Code First atua, porque você pode usar o código que você já tinha criado para definir o banco de dados automaticamente.

Você não tem que não se preocupar com os detalhes do banco de dados e pode se concentrar apenas no código que modela o banco de dados.

O fluxo de trabalho Code First foi criado pela Microsoft após os workflows Model First e Database First para desenvolvedores que desejam escrever código, ao invés de trabalhar com um designer.

Você cria o modelo de objetos para seu aplicativo usando os objetos da Language Runtime (CLR) com uma técnica que envolve o uso de classes POCO - Plain Old CLR Objects. Esse fluxo de trabalho é centrado no código e ao trabalhar com este modelo, você começa com os objetos que não têm relação com o Entity Framework, você não precisa pensar ou se preocupar com o Entity Framework em tudo.

Uma vez que as classes que você deseja usar estão prontas, você usa ferramentas que inferem o modelo de banco de dados a partir do modelo definido nas classes. Ao final você pode voltar e ajustar o modelo para que ele funcione exatamente como você pretende.

Uma diferença importante entre Entity Framework 5 e versões anteriores do Entity Framework é que as classes tornam-se o modelo. Ao trabalhar com versões anteriores , o desenvolvedor tinha a opção de gerar classes POCO. No entanto, era da responsabilidade do desenvolvedor manter o relacionamento entre as classes geradas e o arquivo Entity Data Model (.edmx) que continha o modelo do designer.

Se essas duas fontes não estivessem sincronizadas os resultados eram imprevisíveis.

Como resultado, os desenvolvedores que utilizam versões anteriores do Entity Framework acabavam fazendo mudanças em dois lugares ao usar o Code-First; uma no código e outra no designer. E isso era uma fonte potencial de erros.

Embora a criação do banco de dados seja automática, o Visual Studio não é um vidente, e, você precisa dizer a ele para criar o banco de dados criando uma classe que informa para a aplicação para criar o banco de dados automaticamente.

Para iniciar o processo você precisa informar ao seu aplicativo para usar o Entity Framework 5 usando um assistente e depois disso basta incluir uma referência ao namespace System.Data.Entity na sua classe:

using System.Data.Entity;

public class LivroContext:DbContext
{
   // Cria um contexto do banco de dados
   public DbSet<Livro> LivroCollection { get; set; }
}

Esta classe precisa herdar de DbContext, porém o código que você cria para definir o banco de dados é bem simples.

Resumo do fluxo de trabalho Code-First:

  1. - Criação do seu projeto no Visual Studio;
  2. - Criação das classes POCO que definem as entidades do modelo que irão mapear para as tabelas do banco de dados;
  3. - Inclusão do suporte ao Entity Framework 5 no seu projeto;
  4. - Criação da classe que define o Contexto do banco de dados;
  5. - Compilação da aplicação - Build;

Neste ponto você têm as classes e o contexto requerido para interagir com o banco de dados que ainda não existe.

A criação das classes não faz nada com o banco de dados ainda, o Entity Framework cria o banco de dados quando você adiciona o primeiro registro. Então você precisa também definir o código que faz a inclusão dos registros.

Compreendendo o workflow Model-First

O fluxo de trabalho Model-First (introduzido no Entity Framework 4) foi projetado para tornar mais fácil a criação de novas aplicações que necessitem de suporte a banco de dados sem ter que usar as ferramentas do SGBD para fazê-lo.

Neste fluxo de trabalho você utiliza a IDE do Visual Studio para definir o seu modelo de entidades para gerar um novo banco de dados.

Neste workflow cada tarefa é executada diretamente na IDE do Visual Studio. O fluxo de trabalho começa quando você projeta o banco de dados. No entanto, neste caso, você pode usar um ambiente gráfico, em vez de usar código, para descrever o projeto de banco de dados.

O resultado é o mesmo, você acaba com um banco de dados que contém os dados que você quer na forma que você quiser, sem ter um monte de trabalho extra ou precisar ter um conhecimento do funcionamento interno do banco de dados.

Da mesma forma que o fluxo Code First a interação com o banco de dados gira em torno de um contexto. Na verdade, a interação com o banco de dados é a mesma quer voce use Code First ou Model First. Você segue a mesma seqüência em ambos os casos:

1. Criar o registro que você deseja adicionar ao banco de dados.
2. Definir um contexto de banco de dados.
3. Adicionar o registro no banco de dados usando o contexto.
4. Salve as alterações no banco de dados.

Compreendendo o workflow Database-First

O fluxo de trabalho Database-First (introduzido na versão inicial do Entity Framework ) foi a razão original para usar o Entity Framework.

No workflow DataBase-First você cria um modelo no IDE do Visual Studio e mapeia este modelo para um banco de dados existente.

No entanto, as bases de dados tendem a tornar-se complexas rapidamente, e tentar criar um modelo que os desenvolvedores possam entender não é fácil. Mais difícil ainda é ter que compreender todo modelo para escrever o código que interage com o banco de dados de uma forma segura.

Em muitos aspectos, o workflow DataBase First é o inverso do fluxo Model First pois a base de dados já existe, logo o desenvolvedor tem que ter algumas informações sobre o banco de dados como nome e localização.

No entanto, o desenvolvedor não precisa entender o funcionamento interno do banco de dados pois Entity Framework torna isso transparente ao desenvolvedor.

Na verdade, você pode usar várias bases de dados como fontes para um único modelo quando desejado. Um modelo Entity Framework pode, teoricamente, ocupar tantas bases de dados quanto necessário, e as bases de dados não precisam usar o mesmo RDBMS. A única exigência é que os bancos de dados possuam um provedor que dê suporte ao Entity Framework de modo a poder traduzir as instruções que o Entity Framework entende para e os dados que o SGBD entende.

Uma vez que o modelo esteja pronto, você pode usar o Entity Framework para interagir com os objetos definidos pelo modelo como faria usando o fluxo Code First ou Model First.

Isto significa que você deve criar um contexto e, em seguida, usando esse contexto realizar todas as tarefas necessárias. Nos bastidores, o contexto oferece tudo o que é necessário para gerenciar os dados como um objeto, em vez de tabelas individuais nos bancos de dados.

Selecionando um fluxo de trabalho Entity Framework

A seguir temos uma tabela resumindo os pontos chaves com o objetivo de ajudá-lo a escolher qual o melhor fluxo se adeqüa ao seu caso:

Tipo de Banco de dados Tipo de Projeto Tipo de WorkFlow Descrição
Banco de dados Novo Centrado no Designer Model First Quando você precisa criar um banco de dados novo e que ver o projeto no formato gráfico. Neste fluxo você :
  • Cria o modelo usando o designer .EDMX
  • Informa ao Entity Framework para criar o banco de dados com base no seu projeto
  • O Entity Framework gera automaticamente as classes requeridas para interagir com o banco de dados
       
Banco de dados Existente Centrado no Designer DataBase First Quando você já possui um banco de dados e deseja ver o projeto no formato gráfico. Neste fluxo você:
  • Informa ao Entity Framework para faze a engenharia reversa a partir do banco de dados existente para criar o modelo .EDMX
  • O Entity Framework gera automaticamente as classes requeridas para interagir com o banco de dados
       
Banco de dados Novo Centrado no código Code First Quando você precisa criar um banco de dados novo e deseja ver o projeto no formato de código. Neste Fluxo você:
  • Define as classes que especificam os dados para cada tabela no banco de dados via código
  • Define o mapeamento usando classes
  • Opcionalmente define qualquer condição especial para criar o banco de dados e sua conexão
  • O Entity Framework gera o banco de dados em tempo de execução a partir das suas classes
       
Banco de dados Existente Centrado no código Code First Quando o banco de dados já existe e você define código para mapear para os dados existentes. Neste Fluxo você:
  • Você realiza a engenharia reversa das classes que especificam os dados para cada tabela no banco de dados via código
  • Você faz a engenharia reversa do mapeamento criando classes que usam as definições das tabelas

Nota: A Microsoft não fornece ferramentas para ajudar na engenharia reversa das bases de dados, para isso você precisa baixar o Entity Framework Power Tools.

Eu espero que com as informações deste artigo você consiga definir um workflow adequado ao seu cenário para utilizar o Entity Framework 5.

Em um próximo artigo vou mostrar como podemos usar os workflows Model First e DataBase First. O workflow Code First já foi abordado exaustivamente em diversos artigos que você pode acompanhar nas referências.

João 6:35 Declarou-lhes Jesus. Eu sou o pão da vida; aquele que vem a mim, de modo algum terá fome, e quem crê em mim jamais terá sede.

João 6:36 Mas como já vos disse, vós me tendes visto, e contudo não credes.

Referências:


José Carlos Macoratti