LINQPad:如何使用SQLite整数主键自动赋值

时间:2017-08-18 21:40:23

标签: c# sqlite linqpad

在SQLite中:

  

如果表包含INTEGER PRIMARY KEY类型的列,则该列将成为ROWID的别名。

     

当一个新行插入到SQLite表中时,ROWID既可以指定为INSERT语句的一部分,也可以由数据库引擎自动指定。

     

如果在插入上没有指定ROWID,或者指定的ROWID的值为NULL,则会自动创建适当的ROWID。

我在SQLite中创建了一个带有整数主键的表,然后在LINQPad中打开该文件。我试图通过C#:

在表格中插入一个新行
var episode = new RateableItem()
{
    SourceId = "tal",
    Edition = episodeNum.ToString(),
    Name = episodeName,
    Consumed = false
};

RateableItems.InsertOnSubmit(episode);
SubmitChanges();

在上面的例子中,我还没有指定pimary键。这会失败,因为LINQPad已将主键映射到不可为空的int,因此生成的SQL会在主键中插入0,但由于已存在PK 0的行,因此会失败。

有没有办法用SQLite配置LINQPad,以便为PK传递空值,允许SQLite自动分配PK值?

2 个答案:

答案 0 :(得分:2)

感谢@sgmoore在评论中发布的示例数据库,我能够找到声明表主键,因为AUTOINCREMENT解决了我的问题。

CREATE TABLE RateableItem (
  RateableItemId INTEGER PRIMARY KEY AUTOINCREMENT,
  SourceId NVARCHAR(32) NOT NULL,
  Name NVARCHAR(255),
  Edition NVARCHAR(16),
  Consumed BOOLEAN NOT NULL
);

当我将AUTOINCREMENT添加到我的表定义时,我能够在不指定键的情况下创建新对象。 LINQPad的Schema Explorer没有显示与AUTOINCREMENT和不使用AUTOINCREMENT的主键之间的任何区别,但是我的脚本编译并且SQLite在SubmitChanges()上分配了一个值。

主要行为与AUTOINCREMENT存在一些差异。幸运的是,在我的场景中这些都很好。

答案 1 :(得分:0)

 var episode = new RateableItem()
 {
     PrimaryKey = null,
     SourceId = "tal",
     Edition = episodeNum.ToString(),
     Name = episodeName,
     Consumed = false
 };

这是如何运作的?