【问题标题】:LINQPad: How to use SQLite integer primary key automatic assignmentLINQPad:如何使用 SQLite 整数主键自动赋值
【发布时间】: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 附带的其他行为没有意见。

标签: c# sqlite linqpad


【解决方案1】:

感谢@sgmoore 在 cmets 中发布的示例数据库,我发现将表主键声明为 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 的模式资源管理器没有显示带有 AUTOINCREMENT 的主键与不带的主键之间的任何区别,但我的脚本编译并且 SQLite 在SubmitChanges() 上分配了一个值。

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

【讨论】:

    【解决方案2】:
     var episode = new RateableItem()
     {
         PrimaryKey = null,
         SourceId = "tal",
         Edition = episodeNum.ToString(),
         Name = episodeName,
         Consumed = false
     };
    

    它是如何工作的?

    【讨论】:

    • LINQpad 不会运行脚本,因为 PrimaryKey 不可为空。
    • 不认真。我希望仅使用 LINQPad 和 IQ 驱动程序就能得到一些可行的东西。我此时的解决方法是获取最大主键值、增量,并为插入显式设置它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2012-11-24
    • 2013-04-06
    • 2015-05-11
    • 2012-01-21
    相关资源
    最近更新 更多