2011-08-22 12 views
5

ho folowing entitàtrattati i mapping di colonna SQLite autoincremento in 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 è mappato autoincremento INTEGER colonna (in realtà il solo tipo possibile con AutoIncrement in SQLite)

Quando Provo ad aggiungere un nuovo utente a DB come questo, ottengo un errore:

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 Dopo un googling per e controllo, sembra che SQLite semplicemente non fornisce alcuna funzione SCOPE_IDENTITY(). Ma Linq To SQL lo inietta!

Come posso modificare questo?

risposta

3

In realtà non esiste una soluzione da me trovata per risolvere questo problema, se non quello architettonico => Modifica query LINQ per modificare SQL emesso.

0

Questo sembra un po 'hacky ma secondo lo this answer è sufficiente passare "null" alla colonna id per sqlite per eseguire l'autoincremento. Questo ha funzionato per me:

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

... 

Poi, quando si crea un nuovo oggetto per InsertOnSubmit si può semplicemente omettere la colonna id e questo verrà impostato a null.

Per recuperare il nuovo ID creato con l'autoincremento, vedere here

Problemi correlati