Работа с сопоставлением столбцов автоинкремента SQLite в LINQtoSQL - PullRequest
6 голосов
/ 22 августа 2011

У меня есть следующая сущность

    [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)

Когда я пытаюсь добавить нового пользователя в БД, как это, я получаю ошибку:

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 внедряет это!

Как я могу это изменить?

Ответы [ 2 ]

3 голосов
/ 26 августа 2011

На самом деле я не нашел решения для решения этой проблемы, если бы не один архитектурный => Изменить запрос linq для изменения выводимого SQL.

0 голосов
/ 24 ноября 2014

Это кажется немного странным, но согласно этому ответу вам просто нужно передать "null" в столбец id, чтобы sqlite выполнил автоинкремент.Это сработало для меня:

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

...

Затем, когда вы создаете новый объект для InsertOnSubmit, вы можете просто пропустить столбец идентификатора, и он по умолчанию будет равен нулю.

Чтобы получить новый идентификатор, который былсозданный с использованием автоинкремента см. здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...