2011-08-22 102 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