2009-06-01 44 views
25

Tengo un problema con las claves principales en Entity Framework cuando uso SQLite. SQLite quiere un NULL explícito en la lista de VALORES en una columna de clave primaria autoincrementing. En realidad, no he observado el SQL generado en el contexto EF, pero creo que va con la convención habitual de SQL Server de no proporcionar ningún valor para la columna de autoincrementing.SQLite con Entity Framework

Según el site para el proveedor ADO.NET SQLite, EF es totalmente compatible pero no encuentro ayuda allí. ¿Hay alguna manera de obligar a EF a insertar explícitamente un NULL para el valor de la clave primaria?

+0

Estoy en la misma situación. He intentado reemplazar por mucho tiempo? en el código generado, así que al menos pude establecer el valor nulo, pero no funcionó. El mensaje de error fue: "Los cambios en la base de datos se realizaron correctamente, pero se produjo un error al actualizar el contexto del objeto. ObjectContext podría estar en un estado incoherente. Mensaje de excepción interno: los pares clave-valor que definen una EntityKey no pueden ser nulos o vacío. \ r \ nNombre del parámetro: registro ". Parece que no hay forma de eludir esto, la forma de manejar el autoincrement es algo extraño. – Pablote

+0

Dejé de SQLite en combinación con EF. Hay una publicación sobre este mismo tema en los foros en el sitio de System.Data.Sqlite, pero no hubo ningún movimiento o respuesta durante un tiempo. Pasé a SQL Compact, que presenta sus propios problemas. No puede hacer "claves generadas por el servidor" con EF/SQLCompact. Entonces, por ahora hago ADO estándar de conexión/estilo de comando para inserciones y estoy usando EF para el azúcar LINQ. –

+0

Esto apesta. Creo que el mismo "truco" podría ser utilizado en sqlite. Probé autoincrement con CE y linq con sql y parece funcionar. No lo he probado con sqlite, no estoy seguro si es posible. – Pablote

Respuesta

18

Bueno, finalmente he hecho este trabajo: D. Debe configurar la columna de id como autoincrement, de esta manera funciona con EF. No me preguntes por qué esto no se menciona en la pregunta sobre autoincremento en sqlite faq. Este es un ejemplo:

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

Además, no he encontrado una manera de fijar esto desde dentro de Visual Studio, tuve que hacerlo desde la herramienta de línea de comandos.

ACTUALIZACIÓN: El siguiente código funciona bien.

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); 
     } 

El PersonaID no se ha establecido, y después de la operación de almacenamiento que tenía el valor asigned por SQLite.

+0

Lo vi en algunas publicaciones, pero ¿no tienes que ingresar explícitamente un NULL en la instrucción INSERT para la clave principal? "INSERT INTO Persona VALUES ('Pablo')" no funciona, tienes que hacer "INSERT INTO Persona VALUES (NULL, 'Pablo')" ¿verdad? –

+0

He respondido en la publicación, por lo que el código puede formatearse muy bien. – Pablote

+0

+1 Gracias que funcionó para mí. – IamStalker

3

He tenido el mismo problema con EF y SQLite. trata de leer el segundo mensaje: http://sqlite.phxsoftware.com/forums/p/1418/6162.aspx

La causa de mi problema era que el incremento automático se añadió a la propia base de datos, pero el modelo de entidad no estaba debidamente refrescado. Así que después de la actualización, mi campo parecía algo como esto:

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

(StoreGeneratedPattern = se añadió "Identidad")

Antes de la actualización (con el modelo antiguo), que acaba de intentar establecer el id propiedad a 0, que también funcionó :)

12

Hooray ... ¡He encontrado la solución!

  1. Declara la columna de ID como INTEGER PRIMARY KEY AUTOINCREMENT en tu tabla de creación. ¡INTEGER PRIMARY KEY no funcionará!
  2. Modificar una Entity Framework Modelo en Visual Studio, establezca la StoreGeneratedPattern Identificación propiedad de la columna de "computarizada"
+3

Acabo de dar el primer paso, luego eliminé y creé mi modelo EF. Eso es. En realidad, StoreGeneratedPattern ahora se configuró en "Identidad". Está funcionando ahora. – OneWorld

+1

También lo hice volar estableciendo 'StoreGeneratedPattern' en" Identidad " – Christoph

1

Del libro, "La guía definitiva para SQLite" Leí lo siguiente bajo restricciones de clave principal:

"En realidad, sin embargo, esta columna simplemente será un alias para ROWID. Todos se referirán al mismo valor".

Creo que esa es la razón por la que es necesario establecer AUTOINCREMENT en la definición de la columna.

5

Debe establecer autoincrement en True. Puede hacerlo directamente desde VS haciendo clic en el icono (Administrar índices y claves) desde la barra de herramientas mientras se encuentra en la ventana de la tabla de diseño, luego actualice su Modelo.

image

0

Parece proveedor de EF para SQLite no recoge la columna como la identidad (incremento automático).

Para la base de datos primero, haga clic con el botón derecho en la columna en el diseñador de EDMX y configure StoreGeneratedPattern en Identity.