c# - 如何让 Dapper.Rainbow 在 SQLite 中使用 AutoIncrement 插入到表中?

标签 c# sqlite dapper dapper-rainbow

我在 SQLite 上创建了一个示例表,其中有一个自动递增的 Id 列。

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 )

但是当我第二次尝试插入时,出现以下错误:

Abort due to constraint violation PRIMARY KEY must be unique

这是我的代码

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

关于我在这里做错了什么有什么想法吗?

编辑

SQlite 上的 INTEGER 列是 int64(long) 类型

最佳答案

从我发现的 SQLite FAQ 中:

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

所以我只是将我的类 ID 更改为可为空

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

现在效果很好!

关于c# - 如何让 Dapper.Rainbow 在 SQLite 中使用 AutoIncrement 插入到表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11771166/

相关文章:

c# - 如何最大化单个 TCP 套接字的吞吐量?

sqlite - 如何生成两个日期之间的所有日期

asp.net - Dapper.net交易问题

c# - 使用 dapper 并将一列映射到 json

c# - 将 SQL 查询中的参数投影到对象中

c# - 带有 RestSharp 的 Paypal Rest Api 在 xamarin android 中不工作

c# - 重定向回 Default.aspx

android - 将 SQLite 与外部 SQL 数据库服务器同步

iOS 10 核心数据异常代码错误 : (6922)

c# - 如何在 C#/Bouncy CaSTLe 中创建 PBKDF2-SHA256 密码哈希