[EF][SQLite] 使主鍵自動遞增

  • 9249
  • 0
  • 2012-10-19

摘要:[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即可。