Passo 1: O que é Mapeamento Objeto-Relacional? Passo 2: As classes da aplicação são mapeadas para tabelas do banco Passo 3: Os objetos são mapeados como linhas da tabela
#PraCegoVer - Transcrição dos Slides O que é Mapeamento Objeto-Relacional?
As classes da aplicação são mapeadas para as tabelas do banco
Os objetos são mapeados como linhas da tabela

O que é Mapeamento Objeto-Relacional?

ORM (Object-Relational Mapping) é uma técnica que consiste da conversão das classes da aplicação para tabelas do banco de dados e vice-versa. Da mesma forma, também faz parte desse processo a conversão entre os objetos da aplicação e as linhas da tabela. Ou seja, enquanto no código trabalhamos com classes e objetos, esses são gravados e recuperados do banco de dados na forma de registros/linhas.

Quando efetuamos esse processo manualmente, cabe a nós ler as linhas e colunas da tabela e preencher objetos e suas propriedades. No entanto, no .NET framework (assim como em outras linguagens) temos à disposição frameworks que se encarregam desse processo. Dessa forma, podemos trabalhar apenas com classes e objetos, sem escrever instruções SQL, e o framework faz todas as conversões necessárias para nós.

Neste microexemplo utilizaremos o Entity Framework, que é o principal framework ORM do ecossistema .NET. Confira abaixo o passo a passo de como proceder para efetuar seu primeiro Mapeamento Objeto-Relacional em C#. Para demonstrar esse processo partiremos de um projeto do tipo Console Application criado no Visual Studio.

Passo 1: Criar a classe de domínio

Normalmente em nossos sistemas precisaremos representar elementos do mundo real envolvidos no problema que queremos resolver com esse software. Por exemplo, em um sistema de automação comercial precisaremos representar entidades como Cliente, Produto, Fornecedor, etc. Essas são nossas classes de domínio.

Neste microexemplo criaremos uma classe chamada Cliente a partir da qual vamos persistir dados em uma tabela chamada Clientes no banco de dados. O código dessa classe pode ser visto abaixo:

class Cliente
{
public int Id { get; set; }
public string Nome { get; set; }
public int Idade { get; set; }
public decimal Credito { get; set; }
}

A propriedade Id será usada como chave primária da tabela que será gerada no banco. Essa nomenclatura é >reconhecida por padrão pelo Entity Framework e em seu lugar poderia ser usado ClienteId;

Note que toda propriedade possui os métodos get e set, definidos de forma padrão/vazia. Isso é necessário para que o Entity Framework possa preencher essa propriedade dinamicamente com os dados vindos do banco.

Passo 2: Instalar o Entity Framework

O segundo passo para utilizar o Entity Framework é instalá-lo em nossa aplicação através do NuGet, que é o gerenciador de pacotes do ambiente .NET. Para fazer isso, clique com a direita sobre o projeto no Visual Studio e em seguida acesse o menu Manage NuGet Packages, como vemos na Figura 1.

Acessando o NuGet
Figura 1. Acessando o NuGet

Em seguida busque por EntityFramework e instale o pacote de mesmo nome, como ilustra a Figura 2.

Instalando o pacote EntityFramework
Figura 2. Instalando o pacote EntityFramework

A partir de agora poderemos usar as classes do framework para acessar o banco de dados.

Passo 3: Criar o DbContext

DbContext é uma classe central do Entity Framework. Ela representa uma abstração do banco de dados dentro da aplicação e é por meio dela que acessamos as tabelas (na forma de listas) e os registros (na forma de objetos).

Precisamos então criar uma nova classe que herdará de DbContext e aqui se chamará ClientesContext, como podemos ver a seguir:

Nota: Convenciona-se nomear essa classe com o sufixo Context, uma vez que ela herda de DbContext, mas essa nomenclatura não é obrigatória.

01 class ClientesContext:DbContext
02 {
03 public ClientesContext():base("BancoClientes")
04 {
05 }
06 
07 public DbSet<Cliente> Clientes { get; set; }
08 }

Linha 1: A classe deve herdar de DbContext, que pertence ao namespace System.Data.Entity e deve ser importado por meio da diretiva using;

Linha 3: Aqui invocamos o construtor da classe pai, passando como parâmetro o nome da string de conexão na qual essa classe encontrará as informações necessárias para se conectar ao banco de dados;

Linha 7: Aqui temos a definição da propriedade Clientes, que representará a tabela de mesmo nome no banco de dados. A classe DbSetrepresenta uma coleção de objetos que será mapeada como registros do banco de dados.

Nota: O nome da tabela que será gerada no banco depende do nome da classe (Cliente) e não da propriedade DbSet (Clientes). Por padrão o Entity Framewok pluraliza o nome da classe para gerar a tabela (seguindo o padrão do inglês).

Passo 4: Criar a string de conexão

Como vimos anteriormente a classe ClientesContext faz referência à string de conexão chamada “BancoClientes”. A string de conexão, ou connection string, define as informações necessárias para conectar com o banco de dados. Por padrão ela é definida no arquivo App.config ou Web.config, da seguinte forma:


01 <?xml version="1.0" encoding="utf-8"?>
02 <configuration>
03 <!-- demais elementos do XML -->
04 <connectionStrings>
05 <add name="BancoClientes"
06 connectionString="Data Source=.\SQLExpress;
07 Initial Catalog=DbClientes;
08 Integrated Security=True;"
09 providerName="System.Data.SqlClient" />
10 </connectionStrings>
11 </configuration>

Linha 4: As connection strings de uma aplicação devem estar dentro da seção connectionStrings no XML;

Linha 5: Cada string de conexão é criada com o elemento add, que possui vários atributos: name (o nome dessa string, que é o mesmo referenciado na classe DbContext), connectionString (a sequência de informações para acessar o banco - servidor, nome do banco e modo de autenticação) e providerName (a biblioteca de classes responsável por prover ao Entity Framework o acesso ao banco - nesse caso usamos a biblioteca do ADO.NET para SQL Server).

A partir de agora a classe ClientesContext já tem as informações necessárias para acessar o servidor do SQL Server, criar o banco e criar a tabela Clientes. Então podemos usá-la para gravar nosso primeiro registro, como veremos a seguir.

Passo 5: Gravar dados no banco

Agora que nossa aplicação já está configurada para efetuar o Mapeamento Objeto-Relacional, podemos criar um novo cliente e gravá-lo no banco de dados. Para isso utilizaremos o método Main da classe Program, da seguinte forma:


01 static void Main(string[] args)
02 {
03 Cliente cli = new Cliente
04 {
05 Nome = "Joel",
06 Credito = 900,
07 Idade = 24
08 };
09
10 ClientesContext db = new ClientesContext();
11 db.Clientes.Add(cli);
12 db.SaveChanges();
13
14 Console.WriteLine("Cliente salvo com sucesso.");
15 Console.ReadKey();
16 }

Linhas 3 a 8: Criamos um objeto do tipo Cliente e preenchemos seus dados. Note que não preenchemos o Id, pois ele será gerado pelo banco de dados automaticamente;

Linhas 10 a 12: Instanciamos a classe ClientesContext e a partir dela adicionamos o novo cliente à lista e salvamos a operação com o método SaveChanges;

Linhas 14 e 15: Imprimimos uma mensagem no console e aguardamos o pressionamento de uma nova tecla para finalizar a aplicação.

Se executarmos a aplicação agora veremos que o banco de dados será criado no SQL Server, bem como a tabela de Clientes e o registro será inserido. Isso tudo foi feito utilizando poucas linhas de código e sem escrever instruções SQL, graças ao Mapeamento Objeto-Relacional feito pelo Entity Framework.