2011-08-22 34 views
5

Tôi đã folowing thực thểĐối phó với bản đồ cột SQLite autoincrement trong 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 được ánh xạ tới autoincrement INTEGER loại cột (trên thực tế loại duy nhất có thể với autoincrement trong SQLite)

Khi Tôi cố gắng thêm người dùng mới vào DB như thế này, tôi gặp lỗi:

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:

EDIT Sau một googling cho và kiểm tra, dường như SQLite đơn giản là không cung cấp bất kỳ chức năng SCOPE_IDENTITY(). Nhưng Linq để SQL tiêm nó!

Tôi làm cách nào để thay đổi điều này?

Trả lời

3

Thực ra không có giải pháp nào được tìm thấy bởi tôi để giải quyết vấn đề này, nếu không phải là một kiến ​​trúc một => Thay đổi truy vấn LINQ để thay đổi SQL đã xuất.

0

Điều này có vẻ hơi khó khăn nhưng theo this answer bạn chỉ cần chuyển "null" vào cột id của bạn cho sqlite để thực hiện autoincrement. Điều này làm việc cho tôi:

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

... 

Sau đó, khi bạn tạo một đối tượng mới cho InsertOnSubmit bạn chỉ có thể bỏ qua cột id và nó sẽ mặc định là rỗng.

Để tìm nạp id mới đã được tạo bằng cách sử dụng tính năng tự động tăng, hãy xem here

Các vấn đề liên quan