Entity Framework  - Separando as classes das entidades do Entity Data Model (.edmx) em projetos distintos


 Neste artigo eu vou mostrar como podemos separar as classes das entidade geradas no arquivo .edmx em projetos separados; e vou explicar por que você deve fazer isso em suas aplicações que usam o Entity Framework.

Se você pretende criar aplicações robustas que utilizam o Entity Framework e que estejam aderente às boas práticas de programação, a separação das responsabilidades é um quesito fundamental que você deve considerar em sua aplicação. Dessa forma você vai querer que a sua lógica de domínio e sua lógica de acesso a dados estejam em projetos separados.

Assim, se você decidiu usar o ADO.Net Entity Data Model em sua solução vai notar que o Visual Studio cria automaticamente todas as classes do modelo de dados sob a estrutura do arquivo Entity Data Model (.edmx).
Portanto você terá que separar suas classes do modelo de dados em outro projeto, de modo que você possa adicionar referências para as classes do modelo de dados sem expor seu Contexto de modelo de dados e conexões. Esse artigo, mostra como você pode fazer isso.

Dessa forma você terá uma arquitetura de aplicação limpa para seus projetos e classes, onde você poderá mapear facilmente as suas tabelas de banco de dados e consultas SQL/LINQ para suas classes de modelo de dados, sem expor seu projeto Entity Data Model (especialmente o DB context) para sua camada de interface do usuário, ou outras camadas que não devem ter esse acesso.

Você quer obter a separação de interesses e para isso você deseja que o seu projeto Repositório tenha esta referência ao seu projeto Entity Data Model. No entanto, você quer poder reusar as classes do seu modelo de dados, mas não quer duplicar as classes no seu projeto Entidade (o projeto que contém as classes POCO, modelos de apresentação e outras classes que você deseja referenciar em sua camada de interface do usuário).

Uma forma de obter esse resultado é usar o Entity Framework DBContext Generator. O Gerador DbContext gera arquivos com a extensão *.tt.

O arquivo de modelo de texto (TT) é o arquivo principal a partir da qual todas as suas classes EF derivam. A fim de separar o seu modelo DB das suas classes de entidade, vamos criar um novo arquivo .tt  em seu projeto Entidade, e apontar este arquivo para o seu modelo de dados.

Recursos Usados :

Gerando um Entity Data Model em uma solução

Vamos criar uma solução no VS Express 2013 for Windows Desktop e a seguir vamos incluir um novo projeto chamado DAL onde iremos gerar um Entity Data Model.

Abra o VS Express 2013 for Windows Desktop e clique em New Project;

A seguir selecione o template Visual Studio Solutions -> Blank Solution e informe o nome EF_SeparandoEntidades e clique no botão OK;

A seguir no menu FILE clique em Add -> New Project;

Selecione a linguagem Visual Basic (ou C#) e o template Class Library e Informe o nome DAL e clique no botão OK;

Agora vamos criar um  modelo de dados (Data Model) no projeto DAL. Este projeto irá fornecer o acesso aos dados via repositórios e db context.

Selecione o projeto DAL e no menu PROJECT clique Add New Item;

Selecione a guia Data e o template ADO .NET Entity Data Model e informe o  nome Northwind.edmx pois vamos acessar o banco de dados Northwind.mdf e clique no botão Add;

Na janela do assistente selecione a opção Generate from database e clique no botão Next>;

A seguir selecione a conexão com o banco de dados Northwind e aceite as configurações padrão conforme abaixo e clique no botão Next>;

A seguir selecione as tabelas do banco de dados Northwind para as quais deseja gerar o modelo de entidades e clique no botão Finish;

Ao final do processo você verá na janela Solution Explorer o arquivo Northwind.edmx e na janela do descrito as entidades do modelo gerada a partir das tabelas do banco de dados conforme figura abaixo:

Vamos expandir o arquivo Northwind.edmx clicando no ícone (Show All Files) e clicar no arquivo Northwind.tt para ver todas as classes geradas na estrutura do modelo:

Nosso objetivo é separar essas classes em outro projeto.

Separando os arquivos das entidades do modelo

A seguir no menu FILE clique em Add -> New Project;

Selecione a linguagem Visual Basic (ou C#) e o template Class Library e Informe o nome Entidades e clique no botão OK;

Pronto ! já temos o projeto Entidades para onde iremos mover as classes das entidades do modelo no projeto DAL.

Selecione o projeto Entidades e no menu PROJECT clique em Add New Item;

A seguir selecione a guia Data e o template EF 6.x DbContext Generator e informe o nome Northwind.tt e clique no botão Add;

Será gerado o arquivo Northwind.tt no projeto Entidades.

Clique duas vezes sobre este arquivo e edite a linha que inicia com  " Const inputFile As String = " e substitua o valor informando o caminho relativo do arquivo .edmx no projeto DAL conforme abaixo:

Feito isso salve e compile o projeto.

Após isso na janela Solution Explorer clique no ícone (Show All Files) e a seguir no arquivo Northwind.tt para ver todas as classes geradas conforme abaixo:

Agora podemos remover as classes geradas no projeto DAL. Selecione os arquivos e os remova pois não são mais necessários.

Agora temos que selecionar o arquivo Northwind.Context.tt do projeto DAL e clicar com o botão direito do mouse selecione o item Properties;

Na janela de propriedades altere o item Custom Tool Namespace para o namespace do projeto Entidades. Dessa forma o arquivo de contexto estará no mesmo namespace das nossas entidades evitando erros de compilação.

Agora você pode referenciar o modelo de entidades em seu projeto de interface sem contaminá-lo com a camada de acesso a dados.

João 5:24 Na verdade, na verdade vos digo que quem ouve a minha palavra, e crê naquele que me enviou, tem a vida eterna, e não entrará em condenação, mas passou da morte para a vida.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti