摘要:[EF][SQLite] 使主鍵自動遞增
若要用Entity Framework 連結SQLite資料庫當作資料來源新增資料的話,
先看以下兩種 SQLite 資料庫的 Table Structure :
CREATE TABLE "User1" (uid INTEGER PRIMARY KEY, name VARCHAR(50) NOT NULL)
CREATE TABLE "User2" (uid INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(50) NOT NULL)
這兩個只差 uid 主鍵有AUTOINCREMENT跟沒有AUTOINCREMENT,
那現在來寫代碼測試看看這兩種新增資料有什麼不同,
先假設User1跟User2資料表各已經有一筆資料uid=0, name="王小明",
沒有AUTOINCREMENT的:
using (Entities context = new Entities())
{
context.User1.AddObject(new User1()
{
name = "吳大哥"
});
context.SaveChanges();
}
執行這段代碼後,猜猜如何?
Oh My God! 居然在SaveChanges方法發生錯誤!!!
UpdateException 更新實體時發生錯誤。詳細資訊請參閱內部例外狀況。
原來由於uid是主鍵,所以當上述代碼沒有指定uid,預設數值為0,
所以在新增的時候跟王小明的uid=0有重複,才產生例外錯誤,
但這並不是我們想要的啊!!! 應該要自動遞增最大數值才對,
接下來看有AUTOINCREMENT的:
using (Entities context = new Entities())
{
context.User2.AddObject(new User2()
{
name = "紀曉君"
});
context.SaveChanges();
}
執行後一切正常,在資料表中的資料多了uid=1,name="紀曉君",
原來主鍵條件必須加上AUTOINCREMENT才能自動遞增。
自動遞增問題是解決了,但User1 Table難道就GG了嗎?
由於SQLite不支援直接修改資料表中的欄位型態,
所以可以另外建立一個新的資料表,然後將User1的資料複製過去,
之後在刪除User1,在重新命名新的資料表為User1即可。