Press "Enter" to skip to content

Simplificando o acesso a dados – Simple.Data

Acesso a dados, sempre voltamos a falar sobre o assunto, afinal vivemos isso todo dia, desde que testei o MongoDB fiquei feliz com as possibilidades fora do mundo relacional, mas essa ainda não é uma realidade vivida diariamente, então vamos simplificar a vida com os bancos relacionais!

Existem ótimos frameworks de mapeamento objeto relacional, no mundo .Net o mais famoso é o NHibernate, seguido de perto, ou não :), pelo Entity Framework, cada um com suas vantagens e desvantagens que não cabe especificar nesse artigo.

Agora vamos pensar em um mundo onde não quero ficar mapeando tabela com classe, mas também não quero ficar escrevendo códigos e mais códigos usando ADO.NET puro, é ai que o Simple.Data faz o seu trabalho, e faz muito bem!

O Simple.Data é um projeto OpenSource e está disponível no GitHub, e foi inspirado no ActiveRecord e DataMapper do Ruby, e atualmente possui providers para os seguintes bancos de dados:

  • SQL Server 2005 ou superior
  • SQL Server Compact Edition 4.0
  • Oracle
  • MySQL 4.0 ou superior
  • SQLite
  • MongoDB

Na documentação do projeto, estão informando que o suporte a PostgreSQL e Azure Table Storage está em progresso, então em breve mais novidades serão disponibilizadas!

Nesse artigo, estou utilizando o SQL Compact, e o Simple.Data está disponível para instalação pelo Nuget, o comando para instalação da versão para SQL Compact.

Install-Package Simple.Data.SqlCompact40

Antes de começar a mostrar os códigos, vale citar que o Simple.Data utiliza os recursos de linguagem dinâmica do C#, ou seja a keywork dynamic é utilizada o tempo todo, quando definimos uma conexão com o banco de dados o objeto de retorno já é um dynamic.

Não pretendo explicar dynamic aqui nesse post, para entender mais sobre o assunto eu recomendo o blog do Elemar Jr.

Vamos para o primeiro código, onde estabelecemos a conexão com o banco de dados, lembrando que esse é o formato para SQL CE.

private static dynamic _db;

static void Main(string[] args)
{
    _db = Database.OpenFile("SimpleData.sdf");
    Console.Read();
}

Já que _db é um objeto dinâmico, não temos intellisense para nos ajudar com os objetos do banco de dados, e não existe verificações na hora da compilação :), se der algum problema só vamos descobrir com o software funcionando, mas nada que inviabilize a utilização de objetos dinâmicos ;).

Quando estamos trabalhando com o Simple.Data, não é obrigatório a utilização de POCO´s, ou seja não preciso ter uma classe que representa um tabela, eu faço isso por costume e por facilidades na hora de programar, então eu criei uma classe EstiloMusical que representa minha tabela.

public class EstiloMusical
{
    public int IdEstiloMusical { get; set; }
    public string Nome { get; set; }
}

Então no Simple.Data temos duas opções para as operações básicas, ou seja o famoso CRUD, ou trabalhamos com objetos, nossos POCO´s, ou com parâmetros nomeados.

Toda a geração de SQL é feita pelo Simple.Data, então temos que informar corretamente o nome das tabelas ou campos nas operações, segue dois exemplos de inclusão de dados, a primeira utilizando POCO e a segunda utilizando os parâmetros nomeados.

var estiloMusical = new EstiloMusical
    {
        Nome = "Death Metal"
    };

_db.EstiloMusical.Insert(estiloMusical);

_db.EstiloMusical.Insert(Nome: "Jazz");

Quando precisamos alterar um registro, também temos a opção de fazer utilizando POCO ou os parâmetros nomeados, e ai entra algo muito interessante do Simple.Data, vamos montar o nome do método passando o campo chave que deverá ser utilizado, no caso da minha tabela o nome do campo chave é IdEstiloMusical então o método chamado será UpdateByIdEstiloMusical, segue os códigos:

var estiloMusical = new EstiloMusical
    {
        IdEstiloMusical = 2,
        Nome = "Blues"
    };

_db.EstiloMusical.UpdateByIdEstiloMusical(estiloMusical);

_db.EstiloMusical.UpdateByIdEstiloMusical(IdEstiloMusical: 1, Nome: "Black Metal");

Não vou mostrar toda a API do Simple.Data aqui já que ela é simples e possui uma documentação simples de entender, apesar de tomar alguns cuidados com o dynamic já que não teremos nunhuma checagem em tempo de compilação, o Simple.Data é uma ótima alternativa para acesso a dados, não notei problemas de desempenho, vou criar alguns testes de desempenho depois coloco aqui o resultado.

A solução apresentada aqui está no Github.

Por hoje é isso!

Abraços.

  • João Gabriel

    CARACA MANO! Como o próprio nome diz: simple. Tudo simples, de forma simples, simples de entender.
    Fácil e rápido, só num é muito “prático”, porém, intuitivo.

    Gostei.

  • Muito interessante. Me lembra o projeto ActiveJDBC (http://code.google.com/p/activejdbc/). A questão a se considerar é: eu realmente preciso de um modelo de domínio rico? Se a minha interface é orientada a documentos, a minha API é orientada a serviços (e a documentos), e o meu banco de dados é orientado a registros (ou a documentos), pra que eu preciso ter um modelo orientado a objetos? O reuso de objetos provou ser uma miragem. Modelos complexos de herança muitas vezes são desnecessários. A lógica de negócio está nos serviços. Me parece que vale a pena a idéia de ter um mapeamento de dados em memória muito simples (objetos burros, coleções, hashmaps) e ter um método de acesso a dados que seja mais aderente à forma como esses dados são armazenados nativamente.

  • Pedro Junior

    Pra quem caiu de paraquedas no mundo .NET como eu, o Simple.Data foi de bastante utilidade. Sofri um pouco para entender alguns métodos que não estão documentados, fora isso ta perfeito.

    Valeu Márcio!