2011-08-22 84 views
5
使用SQLite自動增量列映射處理

我已經如下因素實體在LINQtoSQL

[Table(Name = "Users")] 
    public sealed class UserDB 
    { 
     private Int64 _id = -1; 
     private string _username = string.Empty; 

     public UserDB() { } 

     public UserDB(RepositoryInfo repoInfo) 
     { 
      UserName = repoInfo.Account; 
     } 

     [Column(Name = "ID", Storage = "_id", IsDbGenerated = true, IsPrimaryKey = true, UpdateCheck = UpdateCheck.Never)] 
     public Int64 ID { get { return _id; } set { _id = value; } } 

     [Column(Name = "UserName", DbType="nvarchar(50)", Storage = "_username")] 
     public string UserName { get { return _username; } set { _username = value; } } 
    } 

ID被映射到自動增量INTEGER型柱(實際上與SQLite的自動增量的唯一類型可能)

當我嘗試像這樣向DB添加新用戶,但出現錯誤:

public static Int64 AddUser(DataContext context, RepositoryInfo repoInfo) 
{    
    UserDB udb = new UserDB(repoInfo); 

    //an ID of udb is -1, but I tried different values too, doesn't change result 
    var userstable = context.GetTable<UserDB>(); 
    userstable.InsertOnSubmit(udb); 


    context.SubmitChanges(); // here I get a error, see on screen shot 

    return udb.ID; 

} 

Screen shot of the error:

編輯 一個google搜索和檢查後,似乎SQLite的根本不提供任何SCOPE_IDENTITY()功能。但Linq To SQL注入它!

我該如何改變這種情況?

回答

3

其實我沒有找到解決這個問題的解決方案,如果不是那樣的架構問題=>改變linq查詢來改變輸出的SQL。

0

這似乎有點哈克但根據this answer你只需要「空」傳遞給你的ID列sqlite的執行自動增量。當你創建一個新的對象InsertOnSubmit你可以省略id列,它會默認爲null

[Table(Name = "yourtable")] 
class yourclass 
{ 
    [Column(Name = "id", IsPrimaryKey=true)] 
    public int? Id { get; set; } 

... 

然後:這爲我工作。

要獲取使用自動增量創建的新ID,請參閱here