【发布时间】:2017-08-18 21:40:23
【问题描述】:
在 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();
在上面的例子中,我没有指定主键。这会失败,因为 LINQPad 已将主键映射到不可为空的 int,因此生成的 SQL 会将 0 插入到主键中,这会失败,因为 PK 0 的行已经存在。
有没有办法使用 SQLite 配置 LINQPad,以便它为 PK 传递 null,从而允许 SQLite 自动分配 PK 值?
【问题讨论】:
-
我有几个 SqlLite 表。我自己创造的那些都表现出你所看到的行为。但是来自sqlitetutorial.net/sqlite-sample-database 的示例数据库(看起来以相同的方式定义)在 LinqPad 中按预期工作
-
感谢@sgmoore,这很有帮助!我发现的不同之处在于示例数据库中的表使用 AUTOINCREMENT 创建了 PK。当我更改将此添加到我的表中时,它起作用了 - 尽管 LINQPad 的模式资源管理器没有显示两者之间的任何区别,但我可以在不指定键的情况下创建一个新对象。幸运的是,我对 AUTOINCREMENT 附带的其他行为没有意见。