Veremos neste artigo alguns conceitos básicos e técnicas relacionadas ao Entity Framework, explorando um pouco do seu funcionamento através de alguns exemplos práticos. Com isso, uma boa visão do que é necessário para sua utilização será apresentada, além de serem verificadas algumas motivações que levaram ao seu surgimento.
Para que serve
O ADO.NET Entity Framework é uma das principais ferramentas de persistência presentes na plataforma .NET. Este OR/M (Object-Relational Mapping) propõe soluções para minimizar o problema de impedância, abstraindo do desenvolvedor vários detalhes dos bancos de dados, e fornecendo ainda uma série de recursos que aumentam muito a sua produtividade.
Em que situação o tema é útil
No desenvolvimento de aplicações que utilizem bancos de dados relacionais para salvar seus dados, com a utilização do Entity Framework, o banco de dados se torna apenas um detalhe, e o desenvolvedor pode se concentrar no que realmente interessa, ou seja, as regras de negócio a aplicação.
Resumo do DevMan
A utilização do Entity Framework propõe o mapeamento entre o modelo de objetos e o esquema específico de armazenamento, amenizando a disparidade do paradigma objeto/relacional. Além disso, essa ferramenta traz muitos recursos, como linguagens de consulta em alto nível e validação em tempo de compilação. Para que seja possível aproveitar esses benefícios, o entendimento de alguns conceitos se faz necessário, e é isso que esse artigo demonstra.´
A capacidade de recuperar e modificar dados persistentes em aplicativos é um dos pontos mais críticos para o seu planejamento. A prática mais utilizada e bem estabelecida para alcançar tal característica faz uso da tecnologia de banco de dados relacional, que proporciona benefícios em relação à questões como concorrência, desempenho e facilidade de gerenciamento, entre outros.
As tecnologias de acesso a dados da Microsoft sofreram grandes mudanças desde o seu surgimento, e um histórico resumido pode ser observado na Figura 1.
Figura 1. Evolução das tecnologias de acesso a dados da Microsoft
Segundo Andrew Troelsen, o “ADO.NET é a tecnologia de acesso a dados nativa da plataforma .NET, e pode ser utilizada de três maneiras distintas: conectada, desconectada, ou através do Entity Framework” (TROELSEN, 2010, p. 883).
A camada conectada representa a maneira mais direta disponível para o acesso a dados, e também a mais flexível. Sua utilização é muito simples, e esta estrutura pode ser observada na Figura 2.
Figura 2. Modelo conectado do ADO.NET
As classes DataReader, Command e Connection possuem implementações específicas para cada provedor de dados, mas sua utilização é transparente. Através da classe Connection, é definida uma conexão (sua abertura e fechamento ficam a cargo do desenvolvedor), que serve como um canal de comunicação e gerenciamento com o banco de dados. Uma vez estabelecida, é passada para um objeto Command, que fica responsável por informar ao banco de dados uma tarefa à ser executada (pode ser qualquer operação CRUD). No caso de uma consulta, os valores são retornados através de um objeto DataReader. Acompanhe a Listagem 1, onde essa técnica é demonstrada para o banco de dados SQL Server.
Observe que um SqlConnection foi instanciado dentro da cláusula using, que vai liberá-lo automaticamente da memória após sua execução. A conexão é aberta e passada para um SqlCommand, que recebe também instruções SQL e parâmetros para realizar uma consulta por ID, retornada em um DataReader. A conexão será fechada automaticamente ao final das instruções.
Listagem 1. ADO.NET
try {
int id = 99;
string connectionString =
@"Data Source=.\sqlexpress;Initial Catalog=artigosdb;Integrated Security=True;Pooling=False";
using (SqlConnection conn = new SqlConnection(connectionString)) {
conn.Open();
using (SqlCommand cmd = new SqlCommand()) {
cmd.Connection = conn;
cmd.CommandText = "SELECT nome FROM Autores WHERE Autores.Id = @AutorId";
SqlParameter param = new SqlParameter("@AutorId", SqlDbType.Int, 50, "id");
param.Value = id;
cmd.Parameters.Add(param);
Console.WriteLine("Autor: " + cmd.ExecuteScalar());
Console.ReadLine();
}
}
} catch (Exception ex) {
Console.WriteLine(ex.Message);
}
Embora o modelo conectado seja uma alternativa, o ADO.NET foi concebido visando a nuvem, onde o custo do tráfego de rede é considerado alto. O modelo desconectado (Figura 3) tenta amenizar este problema, diminuindo o número de acessos ao banco de dados.
Nessa abordagem, o ator principal é o DataSet, sendo este uma representação em memória das tabelas e relacionamentos do banco de dados. Sua obtenção e manipulação é responsabilidade do DataAdapter, que em conjunto com um objeto Connection, funciona como uma ponte entre o DataSet e o banco de dados. A ideia nesse modelo é que utilizando um DataAdapter, uma conexão com o banco de dados seja aberta, o DataSet obtido e a conexão fechada imediatamente. A aplicação pode então fazer uso do DataSet, e atualizar seu conteúdo enquanto desconectado da fonte de dados. O DataAdapter é capaz de resolver alterações feitas no DataSet, e enviar os dados modificados para o banco de dados (através de instruções SQL).
Juntamente com essas técnicas, o Visual Studio fornece uma ferramenta de modelagem integrada para criar DataSets tipados, gerenciando automaticamente sua criação e geração de código. Isso possibilita uma representação visual do modelo de objetos, bem como oferece muitas vantagens do ponto de vista da produtividade e manutenção de código. Embora essa tecnologia tenha aumentando a escalabilidade dos sistemas, existem críticas quanto a utilização de DataSets tipados, visto que podem se tornar objetos muito pesados para trafegar na rede.
Figura 3. Modelo desconectado do ADO.NET
Apesar das técnicas apresentadas anteriormente terem funcionado bem no passado, ambas deixavam os desenvolvedores com um modelo misto de desenvolvimento, onde código da aplicação e esquema de banco de dados ficavam amarrados. Outro ponto importante, é que o foco dos desenvolvedores deve ser na aplicação, e não no banco de dados.
A utilização da orientação a objetos em conjunto com tecnologia relacional, impõe uma série de dificuldades e conceitos distintos. Essa incompatibilidade de paradigmas é comumente chamada de impedância, e pode ser resolvida com técnicas de mapeamento objeto/relacional.
...