Uma das importantes peças no desenvolvimento de software orientado a objetos e baseado em dados relacionais é definir as classes de domínio do aplicativo e de acesso ao repositório de dados. Como o Entity Framework possui três formas diferentes de definir o modelo de domínio e de acesso a dados, é comum haver dúvidas ou confusões sobre as formas possíveis de se utilizar o Entity Framework.

Para ajudar no assunto, descrevo abaixo as três abordagens:

Primeiro a base de dados (Database First)

Esta foi a primeira modalidade a se disponibilizada pelo EF e está mais direcionada para aplicativos que já possuem uma base de dados definida. A partir da base de dados é feita a engenharia reversa para gerar seu modelo de entidades (.edmx – arquivo xml com o modelo), ou seja, a partir do banco de dados é gerado um conjunto de classes. As alterações posteriores continuam sendo feitas no banco de dados e então é atualizado o modelo a partir do banco de dados.


Primeiro o modelo de dados (Model First)

A segunda modalidade, é a de primeiro definir o modelo de entidades e a partir dele gerar a base de dados. Esta modalidade está mais direcionada para aplicativos novos que ainda não possuam uma base de dados legada. Nesta abordagem, ao definir visualmente o modelo, você também está definindo as classes e por fim o sql que irá dar origem à base de dados.

Uma novidade com esta versão foi que as classes do modelo de entidade não precisavam mais herdar da classe EntityObject. Esta novidade faz o EF trabalhar com o conceito de classes POCOs e abriu caminho para a terceira modalidade, que veremos a seguir.

 

Primeiro as classes (Code First)

A terceira modalidade, está direcionada tanto para base de dados legada quanto bases novas. Ela tem formas de gerar as classes a partir de uma base existente ou gerar uma nova base de dados a partir do código-fonte. Uma das diferenças é que esta modalidade dispensa o modelo na forma de xml (.edmx), pois a estrutura estará definida diretamente nas classes do modelo, ou seja, em código-fonte.

Para fazer o mapeamento no código-fonte é possível usar duas técnicas: Data Annotations ou Fluent API.

Exemplo de Data Annotations
public class Address
{

[Required, MaxLength(150)]
public string StreetAddress { get; set; }

}

Exemplo de Fluent API
public class AddressConfiguration : ComplexTypeConfiguration

{
public AddressConfiguration()
{

Property(a => a.StreetAddress).HasMaxLength(150).IsRequired();

}
}

Resumo

Fonte: Livro Programming Entity Framework: Code First de Julian Lerman e Rowan Miller

Conclusão

As abordagens Database First ou Model First utilizam um modelo visual (.edmx) e Code First um modelo de código-fonte.

Eu particularmente gostei do modo Code First pela flexibilidade e rapidez na definição da estrutura.

Em relação ao uso de Data Annotations e Fluent API ainda não tenho uma opinião formada. O que percebo até o momento é que Data Annotations é mais natural para quem já usou bastante atributos sobre as classes e propriedades, porém gera um acoplamento entre as classes do domínio e informações da camada de acesso a dados. No caso do Fluent API parece um pouco estranho em um primeiro momento quando se comparar com o processo de definir uma tabela no banco de dados, porém assim que se acostuma com a sintaxe fica bom de utilizar, além do que, com esta abordagem pode-se separar o mapeamento da estrutura de dados das classes do domínio.

O Entity Framework Code First está disponível na versão 4.2 do EF e pode ser referenciado no seu projeto usando o NuGet. Além disto, junto com o Code First foi liberado a DbContext API, que é um proxy para a classe ObjectContext, na qual reúne as funcionalidades mais usadas além de algumas alterações para permitir uma utilização mais leve e facilitada.

Uma questão importante é que, independentemente de qual modalidade você escolher, o comportamento do EF durante a execução do aplicativo é igual em todos os modelos, ou seja, tanto faz qual você utilizar.

Leitura recomendada:

    

Até mais.

Rafael Leonhardt