2009-06-01 110 views
25

我在使用SQLite時遇到了Entity Framework中的主鍵問題。 SQLite希望在自動增量主鍵列的VALUES列表中顯式使用NULL。我實際上並沒有在EF上下文中查看生成的SQL,但我相信這是按照通常的SQL Server慣例爲autoincrementing列提供的值。具有實體框架的SQLite

根據ADO.NET SQLite提供程序的site,EF完全支持,但我在這裏找不到任何幫助。有沒有辦法強制EF顯式爲主鍵值插入NULL?

+0

我處於相同的情況。我試過換了很久很久?在生成的代碼中,所以我至少可以自己設置null,但它不起作用。錯誤消息是:「對數據庫的更改已成功提交,但更新對象上下文時發生錯誤。ObjectContext可能處於不一致狀態。內部異常消息:定義EntityKey的鍵值對不能爲空或空。\ r \ n參數名稱:記錄「。似乎沒有辦法繞過這個,處理自動增量的sqlite方式有點奇怪。 – Pablote 2009-06-03 02:49:07

+0

我放棄了SQLite與EF的結合。在System.Data.Sqlite站點的論壇上有一篇關於這個問題的文章,但是一段時間以來一直沒有任何移動或響應。我轉向了SQL Compact,它提出了自己的問題。您無法使用EF/SQLCompact執行「服務器生成的密鑰」。所以,現在我爲插入做標準的連接/命令式ADO,並且我使用了LINQ糖的EF。 – 2009-06-03 16:55:43

+0

這很糟糕。我想在sqlite中可以使用相同的「技巧」。我已經測試了CE和LINQ到sql的自動增量,它似乎工作。沒有用sqlite試過它,不知道它是否可能。 – Pablote 2009-06-04 16:03:16

回答

18

嗯,我終於完成了這項工作:D。您需要將id列設置爲autoincrement,這樣它可以與EF一起工作。不要問我爲什麼在關於sqlite常見問題中的自動增量的問題中沒有提到。這是一個例子:

create table Persona (PersonaID integer primary key autoincrement, Nombre text) 

而且,我也沒有找到一種方法,在Visual Studio中設置此,我不得不在命令行工具來完成。

更新:以下代碼正常工作。

PruebaDBEntities data = new PruebaDBEntities(); 

     foreach (int num in Enumerable.Range(1, 1000)) 
     { 
      Persona p = new Persona() { Nombre = "Persona " + num, Edad = num }; 

      data.AddToPersona(p); 

      data.SaveChanges(); 

      Console.WriteLine(p.PersonaID); 
     } 

PersonaID沒有設置,並且在保存操作之後,它有由sqlite簽名的值。

3

我和EF和SQLite有同樣的問題。 嘗試檢查的第二個職位: http://sqlite.phxsoftware.com/forums/p/1418/6162.aspx

我的問題的原因是,自動增量被添加到數據庫本身,而是實體模型是無法正確刷新。刷新後所以,我場看起來是這樣的:

<Property Name="ID" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" /> 

StoreGeneratedPattern =「身份」加入)

刷新(與舊型號)之前,我只是想設置id屬性爲0,這也起作用:)

12

Hooray ...我找到了解決方案!

  1. 在創建表語句中聲明ID列爲INTEGER PRIMARY KEY AUTOINCREMENT。 INTEGER PRIMARY KEY將不起作用!
  2. 更新你的實體框架模型在Visual Studio中,設置ID列屬性StoreGeneratedPattern來「計算」
1

從書中,「權威指南SQLite的」我讀下主鍵約束如下:

「但實際上,這個列只是ROWID的別名,它們都會引用相同的值。」

我認爲這是需要在列定義中設置AUTOINCREMENT的原因。

5

您必須將自動增量設置爲True。 在設計表格窗口中單擊工具欄上的(管理索引和鍵)圖標,可直接從VS中進行設置,然後更新模型。

image

0

看來EF提供商SQLite不拿起列標識(自動增量)。

對於數據庫首先,右鍵單擊EDMX設計器中的列,並將StoreGeneratedPattern設置爲Identity