Blog

SQL Compact, Identity Columns e Entity Framework


Para quem está desenvolvendo ou quer desenvolver um projeto utilizando o SQL Server Compact 3.5, saiba que existe uma falha relacionada ao comportamento identity em colunas das tabelas da base da dados. Uma alternativa para solucionar isto é não definir na base de dados as colunas como identity e criar um controle externo para índice dos registros. Uma forma de controlar os índices das tabelas é consultando o ultimo índice adicionado, claro que não funcionará como o identity normal, que define o índice baseando-se em um contador, mas funcionará muito bem e permitira o uso da base de dados. Abaixo vemos a implementação desta solução:

 
public static class ExtensionMethods
{
    public static TResult NextId(this ObjectSet table, Expression> selector)
        where TSource : class
    {
        TResult lastId = table.Any() ? table.Max(selector) : default(TResult);

        if (lastId is int)
        {
            lastId = (TResult)(object)(((int)(object)lastId) + 1);
        }

        return lastId;
    }
}

E utilize do seguinte artifício para controlar o índice dos registros:
 
using (DBEntities contexto = new DBEntities())
{
    // cria aluno define um novo objeto aluno
    Aluno aluno = new Aluno() {
        contexto.Aluno.NextId(a => a.Id),
        Nome = "João Felipe Portela" }; 

    // adiciona a lista de alunos
    contexto.AddToAluno(aluno); 

    // salva as alterações
    contexto.SaveChanges();
}

Mais informações em enigmadomain.wordpress.com.


(Este artigo foi atualizado em 08/01/2017)

C# .net SQL Compact Identity Columns Entity Framework