2012-08-02 13 views
5

Creé una tabla de muestra en SQLite que tiene una columna Id que se incrementa automáticamente.¿Cómo consigo que Dapper.Rainbow se inserte en una tabla con AutoIncrement en SQLite?

CREATE TABLE "ESVLIntegration" ("Id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , "ProcessId" TEXT NOT NULL , "UserId" INTEGER NOT NULL , "Status" TEXT NOT NULL , "StartDate" DATETIME NOT NULL , "EndDate" DATETIME, "Operation" TEXT NOT NULL , "SNEquip" TEXT NOT NULL , "CardName" TEXT NOT NULL , "FilePath" TEXT NOT NULL , "Processed" BOOL NOT NULL) 

Pero cuando trato de insertar por segunda vez, me sale el siguiente error:

Abort due to constraint violation PRIMARY KEY must be unique

Este es mi código

public class ESVLIntegration 
{ 
    public long Id { get; set; } 
    public String ProcessId { get; set; } 
    public long UserId { get; set; } 
    public String Status { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
    public String Operation { get; set; } 
    public String SNEquip { get; set; } 
    public String CardName { get; set; } 
    public String FilePath { get; set; } 
    public Boolean Processed { get; set; } 
} 

public class Sample : Database<Sample> 
{ 
    public Table<ESVLIntegration> ESVLIntegration { get; set; } 
} 

private void WriteParameters() 
{ 
    "Writing sample parameters to SQLite DB".LogDebug(); 
    var pars = new ESVLIntegration(); 
    pars.ProcessId = Guid.NewGuid().ToString(); 
    pars.CardName = "gpp3"; 
    pars.StartDate = DateTime.Now; 
    pars.Status = "Start"; 
    pars.Operation = VerifyStatus; 
    pars.SNEquip = "12345"; 
    pars.FilePath = @"C:\Folder\FilePath"; 
    pars.Processed = false; 
    using (var conn = new SQLiteConnection(connStr)) 
    { 
     conn.Open(); 
     var db = Sample.Init(conn, 2); 
     db.ESVLIntegration.Insert(pars); 
    } 
} 

¿Alguna idea de lo que estoy haciendo mal aquí?

EDITAR

columnas INTEGER en SQlite son de Int64 tipo (largos)

+0

va a necesitar hackear la fuente del arco iris para que funcione –

+0

Lo tengo funcionando bien según mi respuesta. Establecer el campo clave como nulable hizo el truco. –

Respuesta

5

Desde el FAQ SQLite que encontré:

With this table, the statement

INSERT INTO t1 VALUES(NULL,123);

is logically equivalent to saying:

INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);

Así que acabo de cambiar mi ID de clase de ser nulo

public class ESVLIntegration 
{ 
    public long? Id { get; set; } 
    public String ProcessId { get; set; } 
    public long UserId { get; set; } 
    public String Status { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
    public String Operation { get; set; } 
    public String SNEquip { get; set; } 
    public String CardName { get; set; } 
    public String FilePath { get; set; } 
    public Boolean Processed { get; set; } 
} 

¡Ahora funciona genial!

Cuestiones relacionadas