Neste artigo vamos criar uma solução que acessa um banco de dados SQL Server usando uma camada de acesso a dados usando o padrão repositório e o Entity Framework 6. Vamos realizar a separação das classes do nosso modelo gerado no Entity Data Model de forma que a camada de apresentação não precise referenciar o projeto onde temos o Entity Data Model.
Você já deve conhecer os benefícios de utilizar uma arquitetura em camadas em seu projeto. Não tenha dúvidas, para a maioria dos cenários onde temos que acessar um banco de dados relacional, a arquitetura em camadas é um dos melhores padrões de projeto para o desenvolvimento de software.
Em uma arquitetura em camadas, temos a separação das responsabilidades do nosso código pela formação de diferentes camadas, como camada de apresentação, de negócios, de serviços, de entidades e de acesso a dados.
Geralmente em uma arquitetura em camadas, a camada de negócios (BLL – Businnes Logic Layer) acessa diretamente os dados a partir da camada de acesso aos dados. Dessa forma, nossa camada de acesso aos dados (DAL – Data Access Layer) está fortemente acoplada às várias fontes de dados e também à camada de negócios. Isso resulta em dificuldades para testar a camada, aumentando o trabalho para isolar a camada de dependências externas e pode levar a erros.
Uma solução é utilizar um repositório entre as camadas de negócio e a de acesso a dados. Quando usamos o Entity Framework, muitas vezes definimos um acesso público ao nosso modelo de entidades para facilitar sua utilização, mas isso dá o acesso direto ao nosso modelo de dados ao mundo externo, e, de acordo com as boas práticas, a fonte de dados não deveria ser diretamente visível a camada de negócios e por isso o padrão repositório entra em cena. Ele encapsula as fontes de dados ou modelo de dados e permite o acesso ao banco de dados através de métodos genéricos.
É isso que iremos mostrar e construir nessa série de artigos usando uma abordagem DataBase First. Então, ao trabalho!
Recursos usados:
- Visual Studio 2013 Express for Windows Desktop
- Entity Framework 6
- Microsoft SQL Server 2012 Express
Definindo o modelo de dados
Neste artigo, eu vou usar o Entity Framework e a abordagem DataBase First e neste caso vamos usar o banco de dados Cadastro.mdf do SQL Server 2012 Express.
Podemos usar as seguintes abordagem com o Entity Framework:
- Code First – Criamos classes POCO que são mapeadas para as entidades;
- Database First – Mapeamos para um banco de dados que já existe;
- Model First – Criamos o modelo conceitual primeiro e depois é gerado o script para criar o banco de dados.
Neste banco de dados vamos usar as tabelas Departamentos e Empregados que possuem as seguintes estruturas:
Departamentos
Empregados
Temos aqui um relacionamento “um-para-muitos” entre a tabela Departamentos e a tabela Empregados:
Criando a solução e a camada de acesso a dados – DAL
Abra o Visual Studio 2013 Express for Windows desktop e clique em Visual Studio Solutions, em seguida, em Blank Solution. Informe o nome da solução como EF6_Repositorio e clique no botão OK.
Agora vamos criar um novo projeto em nossa solução. Clique no menu FILE e a seguir em Add -> New Project. Selecione a linguagem C# e o template Class Library e informe o nome DAL. A seguir, exclua o arquivo Class1.cs criado por padrão.
Vamos criar um Entity Data Model no projeto DAL. Selecione o projeto e Clique em PROJECT -> Add New Item e selecione a guia Data e o template ADO .NET Entity Data Model, informe o nome Cadastro e clique no botão Add.
No assistente selecione a opção EF Designer from database e clique no botão Next>:
Selecione a conexão com o banco de dados Cadastro.mdf (se ele ainda não existir, clique em New Connection e defina a conexão).
Aceite as configurações do assistente que salva a string de conexão no arquivo App.Config e cria o contexto CadastroEntities.
Clique no botão Next>:
Selecione a opção Entity Framework 6.x e clique no botão Next>:
A seguir, selecione as tabelas Departamentos e Empregados e marque as opções conforme a figura abaixo, clicando no botão Finish para concluir essa etapa:
Será gerado o modelo de entidades conforme a figura abaixo:
Temos aqui as entidades Departamento e Empregado mapeadas para as respectivas tabelas.
Note que no Entity Data Model – Cadastro.edmx podemos ver as classes:
-
Do contexto – Cadastro.Context.cs
-
Das entidades – Departamento.cs e Empregado.cs
Nossa próxima tarefa será separar as entidades Cadastro.cs, Departamento.cs e Empregado.cs do modelo de entidades – Cadastro.edmx. Fazendo isso poderemos usar essas entidades nas diferentes camadas da nossa solução. Além disso, é uma boa prática ter a nossa lógica de domínio separada da camada de acesso a dados.
Dessa forma, não precisaremos referenciar a camada DAL na camada de apresentação.
Então vamos criar um novo projeto chamado Model em nossa solução e mover as classes da nossa lógica de domínio para este projeto.
Clique no menu FILE e, a seguir, em Add -> New Project. Selecione a linguagem C# e o template Class Library e informe o nome Model. A seguir, exclua o arquivo Class1.cs criado por padrão.
Para concluir, vamos incluir uma referência do projeto Model no projeto DAL. Clique com o botão direito do mouse sobre o projeto DAL e em Add Reference.
A seguir, selecione a guia Solution e marque o projeto Model:
Na próxima parte do artigo iremos separar as classes das entidades do EDMX.