Pergunta

Eu estou tendo um problema com chaves primárias em Entity Framework ao usar SQLite. SQLite quer um NULL explícita na lista de valores em uma coluna de chave primária autoincremental. Eu realmente não tenho olhou para o SQL gerado no Contexto EF, mas eu acredito que vai com a convenção usual SQL Server de fornecer nenhum valor para a coluna autoincrementável.

De acordo com a local para o provedor ADO.NET SQLite, EF é totalmente suportado, mas eu estou achando nenhuma ajuda lá. Existe uma maneira de forçar EF explicitamente inserir um NULL para o valor da chave primária?

Foi útil?

Solução

Bem, eu finalmente fez este trabalho: D. Você precisa definir a coluna id como autoincrement, desta forma ele não funciona com a EF. Não me pergunte por que isso não é mencionado na pergunta sobre auto-incremento no FAQ sqlite. Este é um exemplo:

create table Persona ( PersonaID integer primary key autoincrement, Nombre text)

Além disso, eu não encontrei uma maneira de definir isso de dentro visual studio, eu tive que fazê-lo a partir da ferramenta de linha de comando.

UPDATE:. O código a seguir funciona bem

PruebaDBEntities data = new PruebaDBEntities();

        foreach (int num in Enumerable.Range(1, 1000))
        {
            Persona p = new Persona() { Nombre = "Persona " + num, Edad = num };

            data.AddToPersona(p);

            data.SaveChanges();

            Console.WriteLine(p.PersonaID);
        }

O PersonaID não foi definido e, após a operação de salvamento que tinha o valor Atribuído pelo SQLite.

Outras dicas

Hooray ... Eu encontrei a solução!

  1. declarar a coluna ID como INTEGER PRIMARY KEY AUTOINCREMENT em sua instrução CREATE TABLE. INTEGER PRIMARY KEY não vai funcionar!
  2. Atualize seu modelo Entity Framework no Visual Studio, defina a propriedade StoreGeneratedPattern coluna ID para "computadorizada"

Você deve definir autoincrement para True. Você pode fazer isso diretamente do VS clicando (Gerenciar índices e chaves) ícone na barra de ferramentas enquanto estiver na janela de tabela de projeto, em seguida, actualizar o seu modelo.

image

Eu tive o mesmo problema com EF e SQLite. Tente verificar o segundo post: http://sqlite.phxsoftware.com/forums/p/1418/6162. aspx

A causa para o meu problema era que o autoincrement foi adicionado ao banco de dados próprio, mas o modelo de entidade não foi devidamente atualizado. Assim, após a atualização, o meu campo parecia algo como isto:

<Property Name="ID" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" />

( StoreGeneratedPattern = "Identidade" foi adicionado)

Antes da atualização (com o modelo antigo), eu apenas tentei definindo a propriedade id a 0, que funcionou bem:)

Do livro, "The Definitive Guide to SQLite" Eu li o seguinte sob restrições de chave primária:

"Na realidade, porém, esta coluna será simplesmente um alias para ROWID. Eles vão todos se referem ao mesmo valor."

Eu acredito que é a razão para a necessidade de AUTOINCREMENT conjunto na definição de coluna.

Parece provedor EF para SQLite não pegar a coluna como identidade (autoincrement).

Para banco de dados primeiro, clique direito a coluna no EDMX designer e definir o StoreGeneratedPattern para Identity.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top