2017-08-18 22 views
1

在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值?

+0

我有一對SqLite表。我自己創造的東西都展現出你所看到的行爲。但是http://www.sqlitetutorial.net/sqlite-sample-database/中的示例數據庫(它看起來是以相同的方式定義的)在LinqPad – sgmoore

+0

中按預期工作,謝謝@sgmoore,這很有幫助!我發現的差異是樣本數據庫中的表格使用AUTOINCREMENT創建了PK。當我更改將其添加到我的表中時,它工作 - 儘管LINQPad的Schema Explorer沒有顯示兩者之間的任何區別,我可以創建一個新的對象,而無需指定密鑰。幸運的是,我對AUTOINCREMENT附帶的附加行爲很滿意。 –

回答

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

這是如何工作的?

+0

LINQpad不會運行該腳本,因爲PrimaryKey不可爲空。 –

+0

好的..你有沒有考慮過使用實體框架? – Harry

+0

不重要。我只希望能夠使用LINQPad和IQ驅動程序。我現在的解決方法是獲取最大主鍵值,增量,併爲插入顯式設置它。 –

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的架構資源管理器沒有顯示AUTOINCREMENT與沒有的主鍵之間的任何區別,但是我的腳本編譯和SQLite分配SubmitChanges()上的值。

與AUTOINCREMENT的主鍵行爲有一些差異。幸運的是,在我的情況下這些都很好。