Подтвердить что ты не робот

SQLite с платформой Entity Framework

У меня проблема с первичными ключами в Entity Framework при использовании SQLite. SQLite хочет получить явный NULL в списке VALUES в столбце первичного ключа автоинкремент. Я действительно не смотрел на сгенерированный SQL в контексте EF, но я считаю, что это происходит с обычным соглашением SQL Server, не предоставляющим значение для столбца автоинкремент.

В соответствии с сайтом для провайдера SQLite ADO.NET, EF полностью поддерживается, но я не нашел там никакой помощи. Есть ли способ заставить EF явно вставить NULL для значения первичного ключа?

4b9b3361

Ответ 1

Хорошо, я, наконец, сделал эту работу: D. Вам нужно установить столбец идентификатора как автоинкремент, так как он работает с EF. Не спрашивайте меня, почему это не упоминается в вопросе об автоинкрементах в sqlite faq. Это пример:

create table Persona ( PersonaID integer primary key autoincrement, Nombre text)

Кроме того, я не нашел способ установить это из Visual Studio, я должен был сделать это из инструмента командной строки.

UPDATE: следующий код работает нормально.

PruebaDBEntities data = new PruebaDBEntities();

        foreach (int num in Enumerable.Range(1, 1000))
        {
            Persona p = new Persona() { Nombre = "Persona " + num, Edad = num };

            data.AddToPersona(p);

            data.SaveChanges();

            Console.WriteLine(p.PersonaID);
        }

PersonaID не был установлен, и после операции сохранения он получил значение asigned sqlite.

Ответ 2

Ура... Я нашел решение!

  • Объявите столбец идентификатора как INTEGER PRIMARY KEY AUTOINCREMENT в инструкции create table. INTIMER PRIMARY KEY не будет работать!
  • Обновите модель Entity Framework в Visual Studio, установите для свойства столбца ID StoreGeneratedPattern значение "Вычислено"

Ответ 3

Вы должны установить для параметра автоинкремент значение True. Вы можете сделать это прямо из VS, щелкнув значок ( "Управление указателями и ключами" ) на панели инструментов, когда вы находитесь в окне таблицы дизайна, затем обновите свою модель.

image

Ответ 4

У меня была такая же проблема с EF и SQLite. Попробуйте проверить второй пост: http://sqlite.phxsoftware.com/forums/p/1418/6162.aspx

Причиной моей проблемы было то, что автоинкремент был добавлен в базу данных, но модель объекта не была должным образом обновлена. Поэтому после обновления мое поле выглядело примерно так:

<Property Name="ID" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" />

(StoreGeneratedPattern = "Identity" )

Перед обновлением (со старой моделью) я просто попытался установить свойство id равным 0:)

Ответ 5

Из книги "Окончательное руководство по SQLite" я прочитал следующее по ограничениям первичного ключа:

"В действительности, однако, этот столбец будет просто псевдонимом для ROWID. Все они будут ссылаться на одно и то же значение."

Я считаю, что это причина необходимости устанавливать AUTOINCREMENT в определении столбца.

Ответ 6

Кажется, что поставщик EF для SQLite не подбирает столбец как личность (автоинкремент).

Сначала для базы данных щелкните правой кнопкой мыши столбец в дизайнере EDMX и установите StoreGeneratedPattern в Identity.