2011-08-22 10 views
5

He folowing entidadTratar con asignación de columna SQLite Autoincrement en 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 se asigna a Autoincrement INTEGER tipo columna (en realidad el único tipo posible con autoincrement en SQLite)

Cuando Intento agregar un nuevo usuario a DB así, me sale un error:

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:

EDITAR Después de un google para comprobar y, parece que SQLite simplemente no proporciona ninguna función SCOPE_IDENTITY(). ¡Pero Linq To SQL lo inyecta!

¿Cómo puedo cambiar esto?

Respuesta

3

En realidad, no hay solución que yo haya encontrado para resolver este problema, si no es que una arquitectónica una => Cambiar la consulta de linq para cambiar el SQL emitido.

0

Esto parece un poco hacky, pero de acuerdo con this answer simplemente necesita pasar "nulo" a su columna de identificación para que sqlite realice la autoincrementación. Esto funcionó para mí:

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

... 

Luego, cuando se crea un nuevo objeto para InsertOnSubmit sólo se puede omitir la columna id y se pondrá por defecto en nulo.

Para recuperar la nueva identificación que se creó utilizando autoincrement ver here

Cuestiones relacionadas